Я использую ниже ItemWriteListener
для хранения значений идентификаторов, когда они встречаются.
Я знаю, что весной существуют контексты Step
и Job
, поэтому я пытаюсь использовать контекст Job для хранения и получения значений.
@JobScope
@Component
public class JobWriteNotificationListener implements ItemWriteListener<Retailer> {
private ExecutionContext context;
public JobWriteNotificationListener(StepExecution context) {
this.context = context.getJobExecution().getExecutionContext();
if (!this.context.containsKey(RETAILER_ID_KEY))
this.context.put(RETAILER_ID_KEY, new HashSet<Integer>());
}
@SuppressWarnings("unchecked")
private Set<Integer> get() {
return (Set<Integer>) this.context.get(RETAILER_ID_KEY);
}
@Override
public void afterWrite(List<? extends Retailer> list) {
Set<Integer> set = get();
list.forEach(id -> set.add(id.getId()));
}
}
Я пытаюсь получить эти значения в afterJob
слушателе.
@JobScope
@Component
public class JobCompletionNotificationListener extends JobExecutionListenerSupport {
private static final Logger log = LoggerFactory.getLogger(JobCompletionNotificationListener.class);
private final JdbcTemplate jdbcTemplate;
public JobCompletionNotificationListener(
JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public void afterJob(JobExecution jobExecution) {
@SuppressWarnings("unchecked") Set<Integer> added = (Set<Integer>) jobExecution.getExecutionContext().get(RETAILER_ID_KEY);
if(jobExecution.getStatus() == BatchStatus.COMPLETED) {
log.info("job completed {} :: added {}", jobExecution.getStatus(), added.size());
}
}
}
Моя проблема в том, что в методе afterJob
jobExecution.getExecutionContext().get(RETAILER_ID_KEY)
генерирует исключение нулевой ссылки.
Из того, что я вижу, я использую контекст Job для обоих?