我的源表有10条记录,我需要读取10条记录,需要处理这些记录并需要将处理过的记录写入目标表。对于这10条记录,我创建了2个分区。但在我的实际项目中,我们不知道每天需要处理多少条记录,那么我如何确定需要多少分区? 是否可以动态添加分区? 请在JSR 352 with Liberty Profile - how to implement checkpointing when ItemReader does a DB query找到我的poc代码。
答案 0 :(得分:2)
这在步骤开始时运行,并构建一个 PartitionPlan ,它定义了分区数和每个分区的属性。
在XML中,您的 <partition>
元素应包含子 <mapper>
元素,而不是子 <plan>
元素,用于静态定义分区数。
但是否则使用 partitionPlan 属性替换类似地执行替换。
E.g。
<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;
}
}