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