Java 批处理 : How to programmatically determine which partition you are running?

标签 java concurrency jsr352 jberet jbatch

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/

相关文章:

java - 如何使用 android 将我录制的音频上传到 dropbox?

swift - 你必须手动指定你的DispatchQueue是串行的吗?

Java并发代码改进思路

java.util.list 的 Java EE 7 Batch (JSR-352) 语法?

spring-batch - JSR 352 Spring Batch 与 Java EE

java - 用java提升框架

java - 在 Java 中加载文件时的 NPE

java - 与 java 访问修饰符混淆。为什么[default]类可以从外部访问?

java - LMAX Disruptor 与 JMS 提供者

junit - JSR :352 Unit testing Java Batch Code?