Partitioned Job 完成后无法自行停止?春季批次

2023-12-09

我编写了一个包含两个步骤的作业,其中两个步骤之一是分区步骤。 分区步骤使用 TaskExecutorPartitionHandler 并在线程中运行 5 个从属步骤。 该作业在 main() 方法中启动。但在每个从属 ItemReader 返回 null(完成符号)后,它并没有停止。即使程序运行完 main() 方法中的最后一行代码(即 System.out.println("Finished")),程序进程也不会停止,挂在内存中而不执行任何操作。我必须按 Eclipse 面板上的停止按钮才能停止该程序。

以下是 JobLauncher.run() 返回的 JobExecution 的内容,表示作业运行的成功状态。

JobExecution:id=0,版本=2,startTime=2015 年 11 月 27 日星期五 06:05:23 CST 2015,endTime=2015 年 11 月 27 日星期五 06:05:39 CST 2015,lastUpdated=2015 年 11 月 27 日星期五 06:05:39 CST,状态=已完成,exitStatus=exitCode=已完成;exitDescription=,job=[JobInstance:id=0,version=0,Job=[jobCensoredPages]],jobParameters=[{}]

7217
完成的

为什么作业运行成功的 Spring Batch 程序仍然挂起? 请指出我在哪里可以解决这个问题。我怀疑 Spring Batch 管理的多线程部分不会停止。

简单的作业运行代码

        Job job = (Job) context.getBean("jobPages");
        try {
            JobParameters p=new JobParametersBuilder()
                .toJobParameters();
            
            JobExecution result = launcher.run(job, new JobParameters());
         
            System.out.println(result.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
        context.getBean("idSet");
        AtomicInteger n=(AtomicInteger) context.getBean("pageCount");
        System.out.println(n.get());        
        System.out.println("Finished");

Petitioner 和 PatitionHandler 的配置

    @Bean @Autowired 
    public PartitionHandler beanPartitionHandler(
        TaskExecutor beanTaskExecutor, 
        @Qualifier("beanStepSlave") Step beanStepSlave
        ) throws Exception
    {
        TaskExecutorPartitionHandler h=new TaskExecutorPartitionHandler();
        h.setGridSize(5);
        h.setTaskExecutor(beanTaskExecutor);
        h.setStep(beanStepSlave);   
        h.afterPropertiesSet(); 
        return h;
    }
    @Bean public TaskExecutor beanTaskExecutor() {
        ThreadPoolTaskExecutor e = new ThreadPoolTaskExecutor();
        e.setMaxPoolSize(5);
        e.setCorePoolSize(5);
        e.afterPropertiesSet();
        return e;
    }

唯一的一步,也是奴隶的一步

@Bean public Step beanStepMaster(
        Step beanStepSlave,
        Partitioner beanPartitioner,
        PartitionHandler beanPartitionHandler
        )   throws Exception 
    {
        return stepBuilderFactory().get("stepMaster")
        .partitioner(beanStepSlave)
        .partitioner("stepSlave", beanPartitioner)
        .partitionHandler(partitionHandler)
        .build();
    }
    @Bean @Autowired 
    public Step beanStepSlave(
        ItemReader<String> beanReaderTest,
        ItemProcessor<String, String> beanProcessorTest,
        ItemWriter<String> beanWriterTest) throws Exception{
        return stepBuilderFactory().get("stepSlave")
            .<String, String>chunk(1)
            .reader(beanReaderTest)
            .processor(beanProcessorTest)
            .writer(beanWriterTest)
            .build();
    }

我的 pom.xml 文件

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>RELEASE</version>
      <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.2.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.2.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>4.2.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.batch</groupId>
        <artifactId>spring-batch-core</artifactId>
        <version>RELEASE</version>      
    </dependency>
    <dependency>
        <groupId>org.springframework.retry</groupId>
        <artifactId>spring-retry</artifactId>
        <version>1.1.2.RELEASE</version>
    </dependency>
    
<dependency>    
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>RELEASE</version>
</dependency>

当我使用 ThreadPoolTask​​Executor 时,我的分区 Spring 批处理应用程序在完成时也遇到了困难。此外,我发现执行程序不允许所有分区的工作完成。

我找到了解决这些问题的两种方法。

第一个解决方案是使用 SimpleAsyncTaskExecutor 而不是 ThreadPoolTask​​Executor。如果您不介意重新创建线程的额外开销,这是一个简单的修复。

第二种解决方案是创建一个 JobExecutionListener 来调用 ThreadPoolTask​​Executor 上的 shutdown。

我创建了一个 JobExecutionListener,如下所示:

@Bean
public JobExecutionListener jobExecutionListener(ThreadPoolTaskExecutor executor) {
    return new JobExecutionListener() {
        private ThreadPoolTaskExecutor taskExecutor = executor;
        @Override
        public void beforeJob(JobExecution jobExecution) {

        }

        @Override
        public void afterJob(JobExecution jobExecution) {
            taskExecutor.shutdown();
        }
    };
}

并将其添加到我的工作定义中,如下所示:

@Bean
public Job partitionedJob(){
    return jobBuilders.get("partitionedJob")
            .listener(jobExecutionListener(taskExecutor()))
            .start(partitionedStep())
            .build();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Partitioned Job 完成后无法自行停止?春季批次 的相关文章

随机推荐

  • 有条件写入 xlsx

    Folks 我目前正在使用一个巨大的 Excel 工作表 python 3 7 1 和 pandas 0 23 4 我的任务是根据条件匹配写入单元格 像这样的东西 val li email protected if val in Cell
  • 如何使用 Java 向 iPhone 发送推送通知消息?

    我想使用 Java 向特定 iPhone 设备发送推送通知消息 我不知道该怎么做 我已经用谷歌搜索过这个 他们建议使用 PayLoad 类 但不从任何 jar 文件中获取此类 请问有人可以指导我使用 Java 将推送通知消息发送到 iPho
  • 如何使用 MonoDevelop 调试 MonoDevelop 加载项?

    主题说明了一切 我在 monodevelop 网站或通过 google 找不到任何信息 甚至添加System Diagnostics Debugger Break 并与运行mono debug MonoDevelop exe似乎没有做任何事
  • 十进制转换为基数 2-16(二进制到十六进制)

    嘿 我正在编写一个程序 将十进制数转换为从二进制到十六进制的任何基本单位 2 3 4 15 16 这就是我到目前为止所得到的 运行 2 15 之间的任何数字都会导致无限循环 我想知道您是否对我的项目的其余部分有任何建议 运行时 这将要求您提
  • Excel JS 加载项适用于 Excel,但不适用于 Excel Online

    我使用 WoodGrove Expense Trends 示例构建了一个 Excel JS 任务窗格加载项 并验证了它可以在我的计算机上的 Excel 2016 中正确运行 但是 当我转到 Excel Online 并尝试添加加载项 通过从
  • Spirit.X3 中的递归规则

    我想使用 Boost Spirit x3 解析递归语法 但由于模板实例化深度问题而失败 语法如下 value int float char tuple int int int float float real char char char
  • AjaxUploadControl 不触发 onuploadcomplete 方法

    我正在尝试在我的网站上实现 AjaxUploadControl 功能 但它不会触发 OnUploadComplete 方法 相反 它只是说文件已上传 100 但该文件不在指定的文件夹中 我在 OnUploadComplete 方法中设置了断
  • 从 python 数组中切片偶数/奇数行的最短方法?

    或者 一个更普遍的问题是 如何对数组进行切片以获取每个第 n 行 因此对于偶数 奇数 您希望跳过一行 但在一般情况下 您希望获得每个 n 第 3 行 跳过 n 1 行 假设你正在谈论一个list 您指定切片中的步骤 和开始索引 语法是lis
  • 如何判断文件共享服务器是否在线? [复制]

    这个问题在这里已经有答案了 如果我想检查服务器可用性但不知道其共享 我什至可以在 Windows 资源管理器窗口中键入其 UNC 名称 或 IP 地址 没有服务器共享目录 我如何在 NET中以编程方式使用它来验证服务器是否在线 我想 My
  • 添加PhoneStateListener

    我正在尝试设置PhoneStateListener但我得到一个PhoneCallListener cannot be resolved to a type public class ButtonView extends FrameLayou
  • 如果文本字段为空,如何禁用按钮?

    我无法禁用我的按钮 在下面的代码中 accept is a Button and email is a TextField email setOnAction ae gt if email getText isEmpty accept se
  • Google Analytics 报告 API - 权限不足 403

    我正在尝试从谷歌分析访问数据 我按照指南进行操作 并且能够对我的用户进行授权并从 oauth 获取代码 当我尝试从 GA 访问数据时 我只得到 403 权限不足 我是否必须以某种方式将 Google API 控制台中的项目连接到我的分析项目
  • Django 中最干净、最容易运行的日期选择器是什么?

    我喜欢索伯时间表日期选择器 但它是一个日期时间选择器 我无法让它只执行日期 有没有关于漂亮的日期选择器的建议 以及如何与 Django 日期表单字段集成的说明 以下是我所做的 根本没有外部依赖 模型 py from django db im
  • BrowserExtension webRequest.onBeforeRequest 返回承诺

    我在 Chrome 和 FireFox 扩展程序中有以下内容 function webListener requestDetails var asyncCancel new Promise resolve reject gt resolve
  • 如何从 CPU 访问计算着色器本地工作组的大小?

    给定一个计算着色器 我将每个维度的局部大小设置为值 x y 和 z 有什么方法可以让我从 C 代码访问该信息吗 IE Pseudo Code c int size 3 x get local sizes from linked comput
  • 用户控件调整大小[重复]

    这个问题在这里已经有答案了 可能的重复 用户控件的 ResizeEnd 等效项 我觉得自己很愚蠢 但我找不到解决我认为很容易的问题的方法 我有一个用户控件 基本上 显示在绘制期间绘制的图像onPaint stage protected ov
  • 使用两个适配器进行垂直和水平交换

    所以基本上我正在尝试让我的应用程序像 snapchat 一样 你可以向左 向右 向上和向下滑动 我的问题是 该应用程序没有意识到有两个适配器 只能工作一个或其中一个 垂直或水平 我该如何制作 以便我可以在我的设备上垂直和水平滑动 空片段 我
  • 如何在android中拖放到放置位置并从dragview中删除项目

    MainActivity java public class MainActivity extends AppCompatActivity implements View OnDragListener private ListView mL
  • 如何使用 ImageWriter 和 ImageIO 在 Java 中编码动画 GIF?

    我查遍了所有地方 但似乎找不到任何易于理解的解释 我发现其他 Java 用户编写的类和方法可以做到这一点 但我希望自己编写 这里是createImage 的方法GIFanim 也许这会给你一个开始 public byte createIma
  • Partitioned Job 完成后无法自行停止?春季批次

    我编写了一个包含两个步骤的作业 其中两个步骤之一是分区步骤 分区步骤使用 TaskExecutorPartitionHandler 并在线程中运行 5 个从属步骤 该作业在 main 方法中启动 但在每个从属 ItemReader 返回 n