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