繁体   English   中英

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

[英]Java batch: How to programmatically determine which partition you are running?

JSR-352批处理中,我想使用分区。 我可以通过配置定义分区数量,或者实现PartitionMapper来实现。

然后,有JobContextStepContext注入,以便为我的处理提供上下文信息。 但是,没有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM