并发Java批处理:如何以编程方式确定正在运行的分区?
在JSR-352批处理中,我想使用分区。我可以通过配置或实现^{
然后,有^{PartitionContext
之类的东西来维护和提供有关我正在运行的分区的详细信息
因此,问题是:
如何告诉区块的每个分区实例它运行在哪个分区中,以便它的ItemReader
只能读取属于该特定分区的项目强>
如果我不这样做,每个分区将对相同的数据执行相同的工作,而不是将输入数据集拆分为n
个不同的分区
我知道我可以在分区计划的属性中存储一些ID,然后我可以使用这些ID在步骤的配置中设置另一个属性,如<property name="partitionId" value="#{partitionPlan['partitionId']}" />
。但这似乎过于复杂和脆弱,因为我必须从分区计划中知道属性的名称,并且必须记住在每个步骤中始终将另一个属性设置为该值
难道没有另一种干净、标准的方法为步骤提供分区信息吗
或者,我应该如何按分区分割工作并将其分配给同一分区块中的不同ItemReader
实例
更新:
jberet似乎具有org.jberet.cdi.PartitionScopedCDI作用域,但它不是JSR标准的一部分
# 1 楼答案
使用分区计划(XML)或分区映射器(编程)定义分区时,将这些信息作为分区属性,然后在项目读取器/处理器/写入器属性中引用这些分区属性
这是告诉item reader和其他批处理工件要处理的资源、开始位置和结束位置的标准方法。这与非分区块配置没有太大区别,在非分区块配置中,还需要使用批属性配置输入数据的源和范围
例如,请从一个jberet测试应用程序中org.jberet.test.chunkPartitionFailComplete.xml