Как мы видим в Spring batch, официальная документация «Передача данных в будущие шаги - Spring Batch» возможна, но большинство из нас боролись с этим, потому что в официальной документации они упомянули две возможности. Уровень шага и один на уровне Задание .Проблема заключается в том, как получить данные на уровне шага?
Мое решение было таким же, как и в официальной документации, но оно не работало.Поэтому я решил сделать следующее:
1- Создать компонент для слушателя повышения:
<beans:bean id="promotionListener"
class="org.springframework.batch.core.listener.ExecutionContextPromotionListener">
<beans:property name="keys" value="someValues"/>
</beans:bean>
2- Установить слушателя на шаг (шаг, на котором вы хотите сохранить данные)
<listeners>
<listener ref="promotionListener"/>
</listeners>
3 - На том же шаге (шаг, на котором будут сохраняться данные) в устройстве записи, вы сохраняете данные.
private StepExecution stepExecution;
@BeforeStep
public void saveStepExecution(StepExecution stepExecution) {
this.stepExecution = stepExecution;
ExecutionContext executionContext = stepExecution.getExecutionContext();
Map<String, String> fieldsMap= new HashMap<>();
executionContext.put("keys", someValues);
}
@Override
public void write(List<? extends Map<String, String>> items) throws Exception {
LOGGER.info(items.toString());
Map<String, String> fieldsMap= new ConcurrentHashMap<>();
items.forEach(item -> item.forEach(fieldsMap::put));
ExecutionContext stepContext = this.stepExecution.getExecutionContext();
stepContext.put("keys", fieldsMap);
}
Вы видите, в моем случае я сохраняю данные на карте (ConcurrentHashMap).
4 - ВАЖНО: На следующем шаге вы хотитечтобы получить данные, которые мы сохранили в предыдущем шаге.В этом порядке мы должны сделать:
Обратите внимание на JobExecution
@BeforeStep
public void retrieveInterStepData(StepExecution stepExecution) {
JobExecution jobExecution = stepExecution.getJobExecution();
Collection<StepExecution> stepExecutions = jobExecution.getStepExecutions();
for (StepExecution steps : stepExecutions) {
ExecutionContext executionContext = steps.getExecutionContext();
if (executionContext.containsKey("keys")) {
this.nationalityMap = (Map<String, String>) executionContext.get("keys");
}
}
}
Вот и все!Вы можете удивиться, почему я не следовал так, как написано в официальной документации?Причина в том, что я работаю со Steps на той же работе.Они имеют одинаковое выполнение работы.Теперь взгляните на изображение моего режима отладки.
Подскажите, пожалуйста, если есть другой способ.
ПРИМЕЧАНИЕ: Пожалуйста, не просто копируйте и вставляйте код из официальной документации, предоставьте свой собственный.ответ или реализация.
Ссылка на документацию на пружинную партию, относящуюся к этой проблеме, находится ниже введите описание ссылки здесь