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