Jsr352 批处理作业定义:如何运行动态计算的分区数?

Jsr352 批处理作业定义:如何运行动态计算的分区数?,jsr352,java-batch,Jsr352,Java Batch,作为批处理API(JSR-352)的新手,我很难对以下(简化的)场景进行建模: 假设我们有一个Batchlet,它在第一步中生成一组动态文件 在第二个步骤,必须在块中单独处理所有这些文件(通过项目阅读器、项目处理器和项目编写器)生成一组新的文件 在第三个步骤中需要将这些新文件打包到一个大型归档中 我找不到定义第二步的方法,因为规范似乎没有提供循环构造(在我的理解中,partition,split和flow仅适用于已知固定大小的集合) 作业xml定义是什么样子的?我必须放弃在第二步进行分块的想法,

作为批处理API(JSR-352)的新手,我很难对以下(简化的)场景进行建模:

  • 假设我们有一个
    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>