在JSR-352批处理中,我想使用分区。我可以通过配置来定义分区的数量,或者实现一个PartitionMapper
来做到这一点。
然后,有JobContext
和StepContext
可注入 为我的处理提供上下文信息。但是,没有PartitionContext
或类似的东西可以维护并提供有关我正在运行的分区的详细信息。
因此问题是:
如何告诉块的每个分区实例它在哪个分区中运行,以便它ItemReader
只能读取属于该特定分区的那些项目?
如果我不这样做,每个分区将对相同的数据执行相同的工作,而不是将输入数据集拆分为n
不同的分区。
我知道我可以在分区计划的属性中存储一些 ID,然后我可以使用这些 ID 在步骤的配置中设置另一个属性,例如<property name="partitionId" value="#{partitionPlan['partitionId']}" />
. 但这似乎过于复杂和脆弱,因为我必须从分区计划中知道属性的名称,并且必须记住在每个步骤中始终将另一个属性设置为该值。
难道没有另一种干净的标准方法来为步骤提供分区信息吗?
或者,我应该如何按分区拆分工作并将其分配给ItemReader
同一分区块中的不同实例?
更新:
jberet 似乎具有org.jberet.cdi.PartitionScoped CDI 范围,但它不是 JSR 标准的一部分。