我编写了一个包含两个步骤的作业,其中两个步骤之一是分区步骤。
分区步骤使用 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>