首页 > 解决方案 > Spring批处理:在监听器中获取ExecutionContext

问题描述

我是春季批次的新手。我需要计算读取、写入和出错的元素。

我已经定义了这样一个步骤:

/*...*/

@Bean
public Step stepMain(StepBuilderFactory stepBuilderFactory) {
    return stepBuilderFactory.get("stepMain").<T, T> chunk(this.chuckSize).reader(reader(null, null)).processor(new Processor()).writer(writer()).faultTolerant().skipPolicy(new AlwaysSkipItemSkipPolicy()).listener(new ListenerReader()).listener(new ListenerProcessor()).listener(new ListenerWriter()).listener(new ListenerChunk()).build();
}

/*...*/

例如,像这样的 ListenerReader:

@Log4j2
public class ListenerReader implements ItemReadListener<T> {

    @Value("#{jobExecution.executionContext}")
    private ExecutionContext executionContext;

    @Override
    public void afterRead(T item) {
        Integer read = (Integer) executionContext.get("reportRead");
        read++;
        executionContext.put("reportRead", read);
    }

    @Override
    public void onReadError(Exception ex) {
        Integer error = (Integer) executionContext.get("reportError");
        error++;
        executionContext.put("reportError", error);
    }

}

但是在 ListenerReader 中,我看不到 executionContext 字段。我该如何解决?

标签: javaspringspring-batch

解决方案


你可以这样做

  1. 使用 JobScope 定义 Bean
  2. 像往常一样在 Step 中使用它
  3. 通过监听器注入它。

下面是一个例子

@Bean
@JobScope
public SimpleReaderListener simpleReaderListener() {
      return new SimpleReaderListener();
}

@Bean
public Step step1() {
    return stepBuilderFactory.get("step1").<SoccerTeam, SoccerTeam> chunk(1)
            .reader(simpleReader()).listener(simpleReaderListener()).processor(new SimpleProcessor())
            .writer(new SimpleWriter()).build();
}

public class SimpleReaderListener implements ItemReadListener<SoccerTeam> {

    @Value("#{jobExecution.executionContext}")
    private ExecutionContext executionContext;

    @Override
    public void afterRead(SoccerTeam soccerTeam) {

    }

推荐阅读