Как поместить значения переменных в контекст шага разделенной среды и получить доступ к ним на следующем шаге. Для этого я использую JSR352.

У меня в папке 10 сегментов. В каждом сегменте по 2 файла. Я внедрил сопоставитель разделов для чтения, обработки и записи одного сегмента за раз.

Я хочу получить значение количества записей, прочитанных из файлов каждого сегмента, и количество записей, вставленных в БД. На следующем шаге отправьте отчет о состоянии задания с указанием количества записей, вставленных в письмо.

Я использую JSR 352 и реализовал поток для каждого сегмента, используя сопоставитель разделов.


person Pesala Sairam    schedule 04.05.2018    source источник
comment
Какой у Вас вопрос? Если речь идет о программе Java, которую вы написали, не могли бы вы также опубликовать код?   -  person cmosher01    schedule 04.05.2018


Ответы (1)


Это аналогичный вопрос это, но это не спрашивало конкретно о доступе к данным на более позднем этапе.

Вы можете начать здесь с этих двух шагов (как указано в другой ответ):

Передача данных из каждого раздела в задание верхнего уровня

1) Используйте статус выхода каждого раздела, чтобы представить количество прочитанных записей для этого раздела.

2) Используйте PartitionAnalyzer.analyzeStatus для объединения их в один объект в потоке верхнего уровня.

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

       // Assumes persistent user data initialized somewhere else
        public void analyzeStatus(BatchStatus batchStatus,
        String exitStatus) throws Exception {
            if (batchStatus.equals(BatchStatus.COMPLETED)) {
                PartitionData ud = (PartitionData)stepCtx.getPersistentUserData();
                int numRecords = Integer.parseInt(exitStatus);
                pd.incrementCount(numRecords);
            }  // else maybe do something else
            // ...
        }

       // Your own class
       public class PartitionData {
           int totalNumRecords;
           public incrementCount(int numRecords) {
              totalNumRecords += numRecords;
           }
       }  

       // 
       // Setting partition exit status as num records processed not shown !
       //

Это потокобезопасно, поскольку спецификация гарантирует, что analyzeStatus будет вызываться отдельно, в одном потоке, по мере завершения каждого раздела.

Передача данных с одного шага на другой (постоянно)

Теперь, в этот момент вы можете решить просто установить этот совокупный объект в transient пользовательские данные задания. Проблема здесь в том, что если задание завершается с ошибкой на следующем шаге, и вы перезапускаете его на этом следующем шаге, эти данные не будут заполнены (в переходных пользовательских данных задания) при перезапуске.

Поэтому было бы лучше как-то сохранить этот совокупный объект. Можно использовать постоянное хранилище пакетного контейнера («репозиторий заданий»), используя постоянные пользовательские данные первого (разделенного) шага. Это не однострочник, поэтому я не покажу его, если вы не спросите.

person Scott Kurz    schedule 04.05.2018
comment
Спасибо! Скотт. Я попытался использовать анализатор разделов, чтобы получить количество записей (общее количество записанных записей) в анализаторе разделов для каждого раздела. Но как мы можем собрать окончательные подсчеты со всех разделов, чтобы они были доступны для других шагов? чтобы получить к нему доступ. - person Pesala Sairam; 04.05.2018
comment
@Pesala, я обновил свой ответ, указав, как вы можете объединить счетчики в одно значение / объект в потоке верхнего уровня (в котором работает PartitionAnalyzer). Если у вас все еще есть вопросы, пожалуйста, дайте более подробную информацию о том, что вы пытаетесь сделать, и я постараюсь ответить. Интересно, могут ли ваши трудности быть больше связаны с доступом к этим данным на более позднем этапе, чем с агрегированием их в первую очередь, но посмотрим, что вы ответите. - person Scott Kurz; 07.05.2018
comment
Большое спасибо, Скотт. Наконец-то я получил способ, который вы упомянули, и успешно преуспел.???????? - person Pesala Sairam; 09.05.2018
comment
Большой. Пожалуйста, примите ответ, когда у вас будет шанс. - person Scott Kurz; 09.05.2018