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

时间:2015-12-10 09:05:59

标签: java spring spring-batch

我已经使用SpringBatch几个月了.. 我曾经将与执行相关的变量(如页数,项目数,批次的当前位置等)存储到Beans中。然后使用ItemReaderItemProcessor - setter和getter将这些bean挂载到ItemWritersetVar()getVar()。此外,这些bean在具有手动同步的线程之间共享。

但现在我发现这可能是一种错误的批处理作业方式。安装到ItemReaders的Bean无法在JobRepository中保留,因此无法记录停止和重新启动作业的状态。所以我仍然需要返回并使用StepExecution / JobExecution。 我在网上找到的那些例子都是基于XML配置,或者更糟糕的SpEL自动连接到setter方法。

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

2 个答案:

答案 0 :(得分:1)

要访问StepExecutionJobExecution,您可以使用带有org.springframework.batch.core.annotation包中注释的方法,或者实现JobExecutionListenerStepExecutionListener之类的表面,具体取决于您的需要

答案 1 :(得分:0)

要访问StepExecutionJobExecution,您的ItemReaderItemProcessorItemWriter必须实现StepExecutionListener

例如:

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
    }
}