Определение пакетного задания: как запустить динамически рассчитанное количество разделов? - PullRequest
3 голосов
/ 17 октября 2019

Будучи новичком в API пакетной обработки (JSR-352), у меня возникли некоторые трудности при моделировании следующего (упрощенного) сценария:

  1. Предположим, у нас есть Batchlet, который создает динамический наборфайлов в первом step.
  2. Во втором step все эти файлы должны обрабатываться индивидуально в chunk с (через ItemReader, ItemProcessor и ItemWriter), что приводит кновый набор файлов.
  3. В третьем step эти новые файлы должны быть упакованы в один большой архив.

Я не смог найти способ определить второешаг, потому что спецификация, кажется, не обеспечивает конструкцию цикла (и в моем понимании partition, split и flow работают только для набора с известным фиксированным размером).

Как могкак выглядит определение задания xml? Должен ли я отказаться от идеи разбивки на второй шаг или мне нужно разделить задачу на несколько заданий? Есть ли другой вариант?

1 Ответ

1 голос
/ 17 октября 2019

Вы можете использовать PartitionMapper для программного определения динамического числа разделов для шага с разделами.

Мапперу необходимо создать PartitionPlan *Объект 1008 *, который устанавливает число разделов и предоставляет для каждого свойства, характерные для разделов.

Метод 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;
}

И затем вы можете ссылаться на значения свойств, относящихся к разделу, в подстановке следующим образом (аналогично тому, как вы ссылаетесь на статически определенные свойства раздела):

    <batchlet ref="myBatchlet">
        <properties>
            <property name="propABC" value="#{partitionPlan['abc']}" />
            <property name="propXYZ" value="#{partitionPlan['xyz']}" />
        </properties>
    </batchlet>
...