Этот вопрос аналогичен этому , но в нем конкретно не задавался вопрос о доступе к данным на более позднем этапе.
Вы можете начать здесь с этих двух шагов (как указано в другом ответе ):
Передача данных из каждого раздела в задание верхнего уровня
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 задания. Проблема заключается в том, что если на следующем шаге задание не выполняется и вы перезапускаете его на следующем шаге, эти данные не будут заполняться (в пользовательских данных переходного процесса) при перезапуске.
Так что было бы лучше как-то сохранить этот агрегатный объект. Можно использовать постоянное хранилище пакетного контейнера («хранилище заданий»), используя постоянные пользовательские данные первого (разделенного) шага. Это не однострочный текст, поэтому я не покажу его, если вы не спросите.