Java批处理:如何以编程方式确定您正在运行的分区?

时间:2018-09-12 13:47:13

标签: java concurrency jsr352 jberet jbatch

JSR-352批次中,我要使用分区。我可以通过配置定义分区数,或实现PartitionMapper来做到这一点。

然后,有JobContextStepContext注射剂为我的处理提供上下文信息。但是,没有PartitionContext之类的东西可以维护并提供有关我正在运行的分区的详细信息。

提出问题:

我如何告诉块的每个分区实例在哪个中运行,以便其ItemReader只能读取属于该特定分区的那些项目?< / strong>

如果我不这样做,则每个分区将对相同数据执行相同的工作,而不是将输入数据集拆分为n个不同的分区。

我知道我可以在分区计划的属性中存储一些ID,然后可以使用它们在步骤的配置中设置另一个属性,例如<property name="partitionId" value="#{partitionPlan['partitionId']}" />。但这似乎过于复杂和脆弱,因为我必须从分区计划中知道该属性的名称,并且必须记住始终为每个步骤将另一个属性设置为此值。

是否存在另一种干净的标准方法来为步骤提供分区信息?

或者,我还应该如何按分区拆分工作,并将其分配给同一分区块中的不同ItemReader实例?

更新:

jberet似乎具有org.jberet.cdi.PartitionScoped CDI范围,但它不是JSR标准的一部分。

1 个答案:

答案 0 :(得分:1)

在使用分区计划(XML)或分区映射器(编程的)定义分区时,请将这些信息作为分区属性,然后在项目读取器/处理器/写入器属性中引用这些分区属性。

这是告诉项目读取器和其他批处理工件的标准方法,该方法处理什么资源,从哪里开始以及从哪里结束。这与非分区块配置没什么不同,在非分区块配置中,还需要使用批处理属性配置输入数据的源和范围。

例如,请从其中一个jberet测试应用中org.jberet.test.chunkPartitionFailComplete.xml