我在一个春季批处理工作中面临以下问题。 以下是高级职位。
<job id="SomeJobId">
<step id="preValidationStep">
<tasklet ref="someTaskLetRef"/>
<next on="COMPLETED" to="actualStepId"/>
<end on="NO-OP"/>
</step>
<!-- this step runs in a loop -->
<step id="actualStepId" next="limitDeciderStep">
<tasklet>
<chunk reader="reader" processor="processor"
writer="writer" commit-interval="1">
</chunk>
<listeners>
<listener ref="ItemWriterStepExecutionListener"/>
</listeners>
</tasklet>
</step>
<!-- this is limit decider -->
<decision id="limitDeciderStep" decider="limitDeciderBean">
<next on="CONTINUE" to="actualStepId" />
<end on="COMPLETED" />
</decision>
</job>
此处添加了作家代码:
public class ItemWriter implements ItemWriter<Record>,StepExecutionListener{
private List<Record> records ; // it holds all records to process in afterStep
public ItemWriter() {
super();
}
@Override
public void write(List<? extends Record> recepients) throws Exception {
// this is do nothing method
// It just accumulates records and stores in Writer like record.add();
}
@override
public ExitStatus afterStep(StepExecution stepExecution) {
try{
// do some processong for all the records accumulated
return new ExitStatus("SUCCESS");
}catch(Exception ex){
// we want to get exception trace printed here by Spring Batch framework
// throwing exception is not helping here . LoopDecider gets called and status is COMPLETED
//If ExitStatus("FAILED") is used , Job status is FAILED , but we loose the exception stack trace as no exception is thrown .
return new ExitStatus("FAILED");
}
}
@override
public void beforeStep(StepExecution stepExecution){
//initliase records
records = new ArrayList<String>();
}
}
如上面的高级代码所示-
1) actualStepId 循环运行
2)循环逻辑由 limitDeciderStep
决定问题是: 1)即使 actualStepId 步骤抛出任何异常(我是从作家那里抛出的), limitDeciderStep 始终在运行
2)理想情况下, limitDeciderStep 不应运行,并且作业应停止执行
3)但这没有发生,Spring Batch和 limitDeciderStep 始终运行
4)无论抛出什么异常,Job始终进入 Complete状态。仅当 LoopDecider 完成步骤
时,它才会完成在抛出异常并阻止 imitDeciderStep 运行时,有什么方法可以使我们执行最高工作?
编辑:
我完全删除了 LoopDecider ,但观察到了相同的行为。 即使从 Writer afterStep 方法抛出异常,作业也不会进入 FAILED 状态 ItemWriterStepExecutionListener是Writer类中提供的StepexecutionListener
由于我正在Writer afterStep 中进行所有最终处理,因此正在从 Writer afterStep 引发异常。
下面是伪代码。
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
try{
//do some processing
}catch(Exception ex){
throw new RunTimeException(ex);
}
}
由于 afterStep 中的抛出异常,作业不会进入失败状态?
编辑2: 经过进一步分析,我发现了以下内容:
1)我从afterStep
方法以 FAILED 返回了退出状态。此后将不调用LoopDecider
。由于状态未设置为 FAILED
2)但是在这种情况下,即使ExitStatus为FAILED,spring batch也不会在控制台上显示错误,因为我们没有抛出任何异常而是返回了ExitStatus。
3)关于如何获取作业状态为FAILED的问题仍然存在,但是在其上下文中带有Spring Batch日志异常消息