在Spring Batch上分配数据中间作业

时间:2015-09-11 20:15:46

标签: multithreading spring spring-batch batch-processing jobs

我想在spring数据中创建一个应该包含两个步骤的作业:

步骤1 - 第一步从数据库中读取某些事务,并生成将通过jobContext属性发送到第2步的记录ID列表。

步骤2 - 这应该是一个分区步骤:应根据从步骤1获得的列表对每个从属步骤进行分区(每个线程从列表中获取不同的Id)并执行其读取/处理/写入操作而不会干扰彼此。

我的问题是,即使我想根据步骤1生成的列表对数据进行分区,spring也会在步骤1开始之前配置步骤2(因此调用分区程序的partition()方法),所以我无法按时注入分区标准。我尝试在分区器bean上使用@StepScope,但它仍然尝试在作业开始之前创建分区。

有没有办法在运行时动态创建步骤分区,或者根据步骤1提供的列表将步骤划分为线程?

一些背景知识:

我正在使用spring批处理批处理作业,它必须处理存储在数据库中的事务。每个事务都绑定到一个帐户(在另一个表中),该帐户具有一个accountBalance,每当处理事务时也需要更新该帐户。

由于我想使用多线程执行这些操作,我认为避免冲突的一种好方法是根据其accountId对事务进行分组,并让每个线程只处理属于该特定accountId的事务。这样,没有两个线程会同时尝试修改同一个账户,因为他们的交易将始终属于不同的账户。

但是,在得到要处理的事务列表并从中提取列表之前,我无法知道需要处理哪个accountId,因此我需要能够在运行时提供列表以进行分区。这就是为什么我认为我可以在上一步中生成该列表,然后进行下一步分区并相应地处理数据。

我采用这种设置的方法是否合情合理?或者我应该寻找一个不同的解决方案?

1 个答案:

答案 0 :(得分:0)

我找不到像我想要的那样在中间分区数据的方法,所以我不得不使用这个解决方法:

我没有将作业分成两步,而是将逻辑从步骤1(“设置步骤”)移动到一个服务方法,该方法返回要处理的事务列表,并在分区内添加了对该方法的调用(我的分区器中的方法,允许我根据返回的列表创建分区。

这在我的情况下实现了相同的结果,虽然我仍然有兴趣知道是否可以在作业中配置分区,因为如果我不得不执行更复杂的处理或写入,则此解决方案将无法工作设置步骤,并希望配置异常处理策略等。如果设置步骤放在步骤链的中间而不是在开始时,它可能不起作用。