2

我的源表有 10 条记录,我需要读取 10 条记录并且需要处理这些记录并且需要将处理过的记录写入目标表。对于这 10 条记录,我创建了 2 个分区。但是在我的实际项目中,我们不知道每天需要处理多少条记录,那么我如何确定我需要多少个分区?是否可以动态添加分区?请在带有 Liberty Profile 的 JSR 352 中找到我的 poc 代码- 如何在 ItemReader 执行数据库查询时实现检查点

4

1 回答 1

2

使用 PartitionMapper 动态定义分区步骤中的分区数。

这在步骤开始时运行并构建一个PartitionPlan,它定义了分区的数量和每个分区的属性。

在 XML 中,您的<partition>元素应该包含一个子 <mapper>元素,而不是 <plan>您用来静态定义分区数量的子元素。

但是您可以使用partitionPlan属性替换以类似方式执行替换。

例如

    <step id="mappedStep">
        <batchlet ref="MyBatchlet">
            <properties>
                <property name="xx" value="#{partitionPlan['xx']}" />
            </properties>
        </batchlet>
        <partition>
            <mapper ref="MyMapper">
                <properties>
                    <property name="mapperProp" value="#{jobProperties['mapperProp']}" />
                </properties>
            </mapper>
        </partition>
    </step>

您的 PartitionMapper 可以使用以下内容构建PartitionPlan

import javax.batch.api.partition.PartitionMapper;
import javax.batch.api.partition.PartitionPlan;
import javax.batch.api.partition.PartitionPlanImpl;

// ...
@Named("MyMapper")
public class MyPartitionMapper implements PartitionMapper {

    @Inject @BatchProperty
    String mapperProp;      // FROM JSL, USE IF YOU WANT, NOT USED HERE

    @Override
    public PartitionPlan mapPartitions() throws Exception {

        numPartitions = calculateNumPartitions() // YOUR LOGIC HERE

        Properties[] props = new Properties[numPartitions];

        Integer i;
         for (i = 0; i < numPartitions; i++) {
            props[i] = new Properties();
            props[i].setProperty("xx", "xxVal" + i);  // SUPPLY PER-PARTITION PROPERTY 'xx'
            props[i].setProperty("yy", "yyVal" + i);  // SUPPLY PER-PARTITION PROPERTY 'yy'
        }

        PartitionPlan partitionPlan = new PartitionPlanImpl();
        partitionPlan.setPartitions(numPartitions);
        partitionPlan.setPartitionProperties(props);
        partitionPlan.setPartitionsOverride(false);

        return partitionPlan;       
    }
}
于 2016-06-06T14:10:55.583 回答