Jsr352 批处理作业定义:如何运行动态计算的分区数?
作为批处理API(JSR-352)的新手,我很难对以下(简化的)场景进行建模:Jsr352 批处理作业定义:如何运行动态计算的分区数?,jsr352,java-batch,Jsr352,Java Batch,作为批处理API(JSR-352)的新手,我很难对以下(简化的)场景进行建模: 假设我们有一个Batchlet,它在第一步中生成一组动态文件 在第二个步骤,必须在块中单独处理所有这些文件(通过项目阅读器、项目处理器和项目编写器)生成一组新的文件 在第三个步骤中需要将这些新文件打包到一个大型归档中 我找不到定义第二步的方法,因为规范似乎没有提供循环构造(在我的理解中,partition,split和flow仅适用于已知固定大小的集合) 作业xml定义是什么样子的?我必须放弃在第二步进行分块的想法,
Batchlet
,它在第一步中生成一组动态文件
步骤
,必须在块
中单独处理所有这些文件(通过项目阅读器
、项目处理器
和项目编写器
)生成一组新的文件步骤中
需要将这些新文件打包到一个大型归档中partition
,split
和flow
仅适用于已知固定大小的集合)
作业xml定义是什么样子的?我必须放弃在第二步进行分块的想法,还是必须将任务分成多个工作?还有其他选项吗?您可以使用以编程方式为分区步骤定义动态分区数
映射程序需要创建一个分区计划对象,该对象设置分区的数量并为每个分区提供特定于分区的属性
映射器的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;
}
public PartitionPlan mapPartitions()引发异常{
int numPartitions=//根据需要计算分区数
//创建属性对象数组,每个分区一个
Properties[]props=新属性[numPartitions];
for(int i=0;i
然后您可以像这样在替换中引用特定于分区的属性值(这与引用静态定义的分区属性的方式相同):
太好了,我将尝试将其组合起来,然后再报告。好的,经过一个小实验后,我现在准备看看这对我们有什么作用。我的分区映射器实现为每个分区返回一个属性,其中包含相应的文件名。我使用了块,而不是所示的batchlet。它的ItemReader、ItemProcessor和ItemWriter在多次迭代中被调用(对于每个分区)。他们可以读取filename属性并独立操作。-非常感谢。很高兴能帮忙。我正在考虑编辑问题描述,使其更清楚地与“如何运行动态计算数量的分区?”相关联。在将来的参考中,这将是非常有意义的。假设我有两个分区,如变量或两个数组列表要分区,我可以用相同的mapPartitions()方法来完成吗?
<batchlet ref="myBatchlet">
<properties>
<property name="propABC" value="#{partitionPlan['abc']}" />
<property name="propXYZ" value="#{partitionPlan['xyz']}" />
</properties>
</batchlet>