Multithreading Spring批处理线程安全ItemReader(进程指示器模式)

Multithreading Spring批处理线程安全ItemReader(进程指示器模式),multithreading,spring,spring-batch,Multithreading,Spring,Spring Batch,我已经使用AMQP(RabbitMQ)实现了远程分块。现在我需要在web容器中运行并行作业 我的简单控制器(testJob使用远程分块): testJob从文件系统(主块)读取数据并将其发送到远程块(从块)。问题在于ItemReader不是线程安全的 对于一些常见的批处理用例,使用多线程步骤有一些实际限制。一个步骤中的许多参与者(例如读写器)都是有状态的,如果该状态未按线程分隔,则这些组件在多线程步骤中不可用。特别是SpringBatch的大多数现成读写器都不是为多线程使用而设计的。但是,可以使

我已经使用AMQP(RabbitMQ)实现了
远程分块
。现在我需要在web容器中运行并行作业

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

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

对于一些常见的批处理用例,使用多线程步骤有一些实际限制。一个步骤中的许多参与者(例如读写器)都是有状态的,如果该状态未按线程分隔,则这些组件在多线程步骤中不可用。特别是SpringBatch的大多数现成读写器都不是为多线程使用而设计的。但是,可以使用无状态或线程安全的读写器,Spring批处理示例中有一个示例(parallelJob),显示了使用进程指示符(请参阅)跟踪数据库输入表中已处理的项

我被认为是spring批处理github存储库上的parallelJob示例


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

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

但是为了回答您关于流程指示器模式的直接问题,我不确定关于它本身的好文档在哪里。Spring批处理示例中有一个它的实现示例(并行作业使用它)


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

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

但是为了回答您关于流程指示器模式的直接问题,我不确定关于它本身的好文档在哪里。Spring批处理示例中有一个它的实现示例(并行作业使用它)

其背后的思想是为要处理的记录提供状态。在作业/步骤开始时,将这些记录标记为“正在处理”。提交记录时,将其标记为已处理。这样就不需要跟踪读卡器中的状态,因为您的状态实际上在db中(您的查询只查找标记为“正在处理”的记录)

@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();
        }

    }

}