批处理作业定义:如何运行动态计算的分区数?



作为批处理 API (JSR-352( 的新手,我在建模以下(简化(场景时遇到了一些困难:

  1. 假设我们有一个Batchlet,它在第一step中生成一组动态文件。
  2. 在第二个step中,所有这些文件必须在chunk内单独处理(通过ItemReaderItemProcessorItemWriter(,从而产生一组新的文件。
  3. 在第三个step中,这些新文件需要打包在一个大型存档中。

我找不到定义第二步的方法,因为规范似乎没有提供循环结构(在我的理解中partitionsplitflow仅适用于具有已知固定大小的集合(。

作业 xml 定义是什么样的?我是否必须放弃在第二步中分块的想法,还是必须将任务划分为多个作业?还有其他选择吗?

可以使用分区映射器以编程方式为分区步骤定义动态分区数。

映射器需要创建一个PartitionPlan对象,该对象设置分区数并为每个分区提供特定于分区的属性。

映射器的mapPartitions((方法将如下所示:

public PartitionPlan mapPartitions() throws Exception {
int numPartitions = // calculate number of partitions, however you want
// create an array of Properties objects, one for each partition
Properties[] props = new Properties[numPartitions];
for (int i = 0; i < numPartitions; i++) {
// create a Properties object for this partition
props[i] = new Properties();
props[i].setProperty("abc", ...);
props[i].setProperty("xyz", ...);
}
// use the built-in PartitionPlanImpl from the spec or your own impl
PartitionPlan partitionPlan = new PartitionPlanImpl(); 
partitionPlan.setPartitions(numPartitions);
// cet the Properties[] onto your plan
partitionPlan.setPartitionProperties(props);
return partitionPlan;
}

然后,您可以像这样替换特定于分区的属性值(这与引用静态定义的分区属性的方式相同(:

<batchlet ref="myBatchlet">
<properties>
<property name="propABC" value="#{partitionPlan['abc']}" />
<property name="propXYZ" value="#{partitionPlan['xyz']}" />
</properties>
</batchlet>

相关内容

  • 没有找到相关文章

最新更新