динамическое добавление разделов в WebSphere JSR 352

В моей исходной таблице 10 записей, и мне нужно прочитать 10 записей, обработать их и записать обработанные записи в целевую таблицу. Для этих 10 записей я создал 2 раздела. Но в моем реальном проекте мы не знаем, сколько записей ежедневно мне нужно обрабатывать, так как я могу решить, сколько разделов мне нужно? Можно ли динамически добавлять разделы? Пожалуйста, найдите мой poc-код в JSR 352. с профилем Liberty — как реализовать контрольные точки, когда ItemReader выполняет запрос к БД.


person Srinivas K    schedule 06.06.2016    source источник


Ответы (1)


Используйте PartitionMapper для динамического определения количества разделов на этапе разделения.

Это запускается в начале шага и создает 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;       
    }
}
person Scott Kurz    schedule 06.06.2016
comment
Спасибо Скотту за помощь. На самом деле я не могу найти ни одного примера кода для реализации сопоставления разделов. Не могли бы вы помочь мне, где я могу найти образец. Еще одна проблема, например, мне нужно передать разные параметры в каждый раздел для извлечения данных, поскольку моя исходная таблица имеет только метку времени, поэтому мне нужно передать строки меток времени с 12:00 до 18:00 в первый раздел и с 18:00 до 12:00 разделов на другой раздел. - person Srinivas K; 10.06.2016
comment
спасибо за вашу быструю помощь. Я попробую этот пример. - person Srinivas K; 10.06.2016