3

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

  1. 假设我们有一个Batchlet在 first 中生成一组动态文件的step.
  2. 在一秒钟内,所有这些文件必须在s (via和) 中step单独处理,从而生成一组新文件。chunkItemReaderItemProcessorItemWriter
  3. 在第三个step中,这些新文件需要打包在一个大型档案中。

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

工作 xml 定义如何?是否必须放弃第二步分块的想法,还是必须将任务分成多个工作?还有其他选择吗?

4

1 回答 1

2

您可以使用PartitionMapper以编程方式为分区步骤定义分区的动态数量。

映射器需要创建一个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>
于 2019-10-17T12:44:47.060 回答