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