3

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

然后,有JobContextStepContext可注入 为我的处理提供上下文信息。但是,没有PartitionContext或类似的东西可以维护并提供有关我正在运行的分区的详细信息。

因此问题是:

如何告诉块的每个分区实例它在哪个分区中运行,以便它ItemReader只能读取属于该特定分区的那些项目?

如果我不这样做,每个分区将对相同的数据执行相同的工作,而不是将输入数据集拆分为n不同的分区。

我知道我可以在分区计划的属性中存储一些 ID,然后我可以使用这些 ID 在步骤的配置中设置另一个属性,例如<property name="partitionId" value="#{partitionPlan['partitionId']}" />. 但这似乎过于复杂和脆弱,因为我必须从分区计划中知道属性的名称,并且必须记住在每个步骤中始终将另一个属性设置为该值。

难道没有另一种干净的标准方法来为步骤提供分区信息吗?

或者,我应该如何按分区拆分工作并将其分配给ItemReader同一分区块中的不同实例?

更新:

jberet 似乎具有org.jberet.cdi.PartitionScoped CDI 范围,但它不是 JSR 标准的一部分。

4

1 回答 1

1

使用分区计划 (XML) 或分区映射器(编程)定义分区时,将这些信息作为分区属性包括在内,然后在项目读取器/处理器/写入器属性中引用这些分区属性。

这是告诉项目阅读器和其他批处理工件要处理什么资源、从哪里开始以及在哪里结束的标准方法。这与非分区块配置没有太大区别,在非分区块配置中,您还需要使用批处理属性配置输入数据的来源和范围。

例如,请从jberet测试应用程序之一中获取 org.jberet.test.chunkPartitionFailComplete.xml。

于 2018-09-12T15:11:37.200 回答