在 ItemReader/Processor/Writer 中访问 StepExecution/JobExecution 的最佳方式

wok*_*kmi 2 java spring spring-batch

我已经使用 SpringBatch 几个月了。我曾经将与执行相关的变量(如页数、项目数、批次的当前位置等)存储到 Bean 中。然后,通过使用, -setter 和 getter将这些 Bean 安装到ItemReader,上。这些 bean 还通过手动同步在线程之间共享。ItemProcessorItemWritersetVar()getVar()

但现在我发现这可能是执行批处理作业的错误方法。安装的 BeanItemReaders无法持久化JobRepository,因此无法记录作业停止和重新启动的状态。所以我还是需要回去使用StepExecution/ JobExecution。我在网上找到的那些例子都是基于 XML 配置,或者是更糟糕的 SpEL 自动连接到 setter 方法。

我纯粹使用 Java Config..是否有 Java 配置或面向 Java 代码的访问方式StepExecution?访问各种类型的最佳实践是什么ExecutionContext

小智 7

要访问StepExecution和,JobExecution您必须执行。ItemReaderItemProcessorItemWriterStepExecutionListener

例如:

public class MyCustomItemWriter implements ItemWriter<Object>, StepExecutionListener {

    private StepExecution stepExecution;

    @Override
    public void beforeStep(StepExecution stepExecution) {
        this.stepExecution = stepExecution;
    }

    @Override
    public ExitStatus afterStep(StepExecution stepExecution) {
        return stepExecution.getExitStatus();
    }

    @Override
    public void write(List<? extends Object> list) throws Exception {
        if (null == list || list.isEmpty()) {
            throw new Exception("Cannot write null or empty list");
        }
        ExecutionContext stepExecContext = this.stepExecution.getExecutionContext()
        ExecutionContext jobExecContext = this.stepExecution.getJobExecution().getExecutionContext();
        // TODO: Write your code here
    }
}
Run Code Online (Sandbox Code Playgroud)