[英]Java batch: How to programmatically determine which partition you are running?
在JSR-352批处理中,我想使用分区。 我可以通过配置定义分区数量,或者实现PartitionMapper
来实现。
然后,有JobContext
和StepContext
注入,以便为我的处理提供上下文信息。 但是,没有PartitionContext
等维护并提供有关我正在运行的分区的详细信息。
因此问题是:
如何告诉每个分块实例的块正在运行哪个分区,以便它的ItemReader
只能读取属于该特定分区的那些项目?
如果我不这样做,每个分区将对相同的数据执行相同的工作,而不是将输入数据集拆分为n
不同的分区。
我知道我可以在分区计划的属性中存储一些ID,然后我可以使用它在步骤的配置中设置另一个属性,如<property name="partitionId" value="#{partitionPlan['partitionId']}" />
。 但这似乎过于复杂和脆弱,因为我必须从分区计划中知道属性的名称,并且必须记住始终为每个步骤将另一个属性设置为此值。
是否有另一种干净,标准的方法来为步骤提供分区信息?
或者,我应该如何通过分区拆分工作并将其分配给同一分区块中的不同ItemReader
实例?
更新:
似乎jberet具有org.jberet.cdi.PartitionScoped CDI范围,但它不是JSR标准的一部分。
使用分区计划(XML)或分区映射器(programatical)定义分区时,请将这些信息作为分区属性包含在内,然后在项目读取器/处理器/写入器属性中引用这些分区属性。
这是告诉项目阅读器和其他批处理工件要处理哪些资源,从哪里开始以及在何处结束的标准方法。 这与非分区块配置没有太大区别,在非配置块配置中,您还需要使用批处理属性配置输入数据的源和范围。
例如,请org.jberet.test.chunkPartitionFailComplete.xml从jberet测试应用程序之一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.