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

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

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

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

3
Jens Piegsa 17 Окт 2019 в 10:55

1 ответ

Лучший ответ

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

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

Метод 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>
2
Jens Piegsa 17 Окт 2019 в 19:20