Как поместить значения переменных в шаговый контекст многораздельной среды и получить доступ к ним на следующем шаге. Я использую для этого JSR352 - PullRequest
0 голосов
/ 04 мая 2018

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

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

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

1 Ответ

0 голосов
/ 04 мая 2018

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

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

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

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 !
       //

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

Передача данных от одного шага к следующему (постоянным образом)

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...