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