Ключ контекста выполнения NULL в JobExecutionListenerSupport - PullRequest
1 голос
/ 23 июня 2019

Я использую ниже 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 для обоих?

1 Ответ

0 голосов
/ 25 июня 2019

создайте @Component в @JobScope и вставьте его в каждый компонент. Он будет доступен в объеме.

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