Spring Batch线程安全ItemReader(流程指示器模式)

时间:2015-07-23 22:03:10

标签: multithreading spring spring-batch

我已经使用AMQP(RabbitMQ)实现了Remote Chunking。现在我需要从Web容器中运行并行作业。

我的简单控制器(testJob使用远程分块):

@Controller
public class JobController {

    @Autowired
    private JobLauncher jobLauncher;

    @Autowired
    private Job testJob;

    @RequestMapping("/job/test")
    public void test() {
        JobParametersBuilder jobParametersBuilder = new JobParametersBuilder();
        jobParametersBuilder.addDate("date",new Date());
        try {
            jobLauncher.run(personJob,jobParametersBuilder.toJobParameters());
        } catch (JobExecutionAlreadyRunningException | JobRestartException | JobParametersInvalidException | JobInstanceAlreadyCompleteException e) {
            e.printStackTrace();
        }

    }

}

testJob从文件系统(主块)读取数据并将其发送到远程块(slave chunk)。问题是ItemReader不是线程安全的。

  

对于一些常见的批处理用例,使用多线程步骤存在一些实际限制。步骤中的许多参与者(例如读者和作者)是有状态的,并且如果状态没有被线程隔离,则那些组件在多线程步骤中不可用。特别是Spring Batch的大多数现成的读者和作者都不是为多线程使用而设计的。但是,可以使用无状态或线程安全的读取器和编写器,并且Spring Batch Samples中有一个示例(parallelJob),它显示了使用过程指示器(请参阅Section 6.12, “Preventing State Persistence”)来跟踪已在数据库输入表中处理的项目。

我在spring batch github存储库上考虑了parallelJob示例 https://github.com/spring-projects/spring-batch/blob/master/spring-batch-samples/src/main/java/org/springframework/batch/sample/common/StagingItemReader.java

我对过程指标模式有点困惑。在哪里可以找到有关此模式的更多详细信息?

1 个答案:

答案 0 :(得分:4)

如果您只关心的是ItemReader实例将在作业调用中共享,您可以将ItemReader声明为步骤范围,并且您将获得一个新的每次调用的实例都会消除线程问题。

但要回答关于流程指标模式的直接问题,我不确定它本身的优秀文档在哪里。在Spring Batch Samples中有一个它的实现示例(并行作业使用它)。

背后的想法是,您要为要处理的记录提供状态。在作业/步骤开始时,您将这些记录标记为正在处理中。记录提交后,您将其标记为已处理。这样就无需跟踪阅读器中的状态,因为您的状态实际上位于数据库中(您的查询只查找标记为进程中的记录)。