【发布时间】:2016-03-01 02:35:28
【问题描述】:
我编写了一个包含两个步骤的作业,其中两个步骤之一是分区步骤。 分区步骤使用 TaskExecutorPartitionHandler 并在线程中运行 5 个从属步骤。 该作业在 main() 方法中启动。但它并没有在每个奴隶 ItemReader 返回 null 后停止 - 完成符号。即使在程序运行通过 main() 方法中的最后一行代码(即 System.out.println("Finished"))之后,程序进程也不会停止,挂在内存中并且什么也不做。我必须按下 Eclipse 面板上的停止按钮来停止程序。
以下是 JobLauncher.run() 返回的 JobExecution 的内容,表示 Job 运行成功状态..
JobExecution: id=0, version=2, startTime=Fri Nov 27 06:05:23 CST 2015, endTime=Fri Nov 27 06:05:39 CST 2015, lastUpdated=Fri Nov 27 06:05:39 CST 2015, status=COMPLETED, exitStatus=exitCode=COMPLETED;exitDescription=, job=[JobInstance: id=0, version=0, Job=[jobCensoredPages]], jobParameters=[{}]
7217
完成
为什么一个成功运行 Job 的 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");
Patitioner 和 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>
【问题讨论】:
-
您好,欢迎来到 Stack Overflow。首先,您应该阅读stackoverflow.com/help/how-to-ask 的提问指南以寻求帮助。如果您在遇到错误时将代码(使用编辑器中的代码格式化选项)包含在 cmets 中,您的问题将获得更多帮助。人们将更容易理解您的问题并提供帮助。
-
我只是希望那些熟悉 Spring Batch 内部结构或解决了相同问题的人能够对我的问题有所了解。我可以提供您进行分析所需的一切..
-
与 Spring Batch 框架相关。
-
SpringBatch 没有挂起,它完成了。但是由于某种原因,spring 上下文没有关闭。你在使用 SpringBoot 吗?和/或您是否有任何其他活动的弹簧模块,例如 web 模块?还是执行器?这将有助于了解您的 pom 中有哪些依赖项;你能把它们贴出来吗?此外,在您收到“已完成”消息后的线程转储可以提供有意义的见解。
-
+Hansjoerg Wingeier 感谢您提供非常有用的见解。我没有使用 SpringBoot,只是在 helloworld 命令行程序中使用 SpringBatch。我在 pom.ini 中的版本标记中添加了“RELEASE”,因此 Spring Framework 和 SpringBatch 的版本应该是最新的。目前我怀疑挂起是由误用的 Partitioner 或 PartitionHandler 或 TaskExecutor 引起的。它们是如此令人困惑,因为关于如何使用它们的例子很少。我不知道分区步骤如何处理线程,因此线程转储似乎不太可能。但在日志文件中,5 个设计线程中只有一个似乎工作
标签: java spring spring-batch partition