我已经使用SpringBatch几个月了..
我曾经将与执行相关的变量(如页数,项目数,批次的当前位置等)存储到Beans中。然后使用ItemReader
,ItemProcessor
- setter和getter将这些bean挂载到ItemWriter
,setVar()
,getVar()
。此外,这些bean在具有手动同步的线程之间共享。
但现在我发现这可能是一种错误的批处理作业方式。安装到ItemReaders
的Bean无法在JobRepository
中保留,因此无法记录停止和重新启动作业的状态。所以我仍然需要返回并使用StepExecution
/ JobExecution
。
我在网上找到的那些例子都是基于XML配置,或者更糟糕的SpEL自动连接到setter方法。
我纯粹使用Java Config ..是否有Java配置或面向Java代码的方式来访问StepExecution
?访问各种ExecutionContext
的最佳做法是什么?
答案 0 :(得分:1)
要访问StepExecution
,JobExecution
,您可以使用带有org.springframework.batch.core.annotation
包中注释的方法,或者实现JobExecutionListener
,StepExecutionListener
之类的表面,具体取决于您的需要
答案 1 :(得分:0)
要访问StepExecution
和JobExecution
,您的ItemReader
,ItemProcessor
或ItemWriter
必须实现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
}
}