我正在使用一个tasklet和一个StepExecutionListener
但似乎没有监听器回调我的tasklet抛出异常的情况。对于各种其他侦听器类型 - ChunkListener
,ItemProcessListener
等 - 但是这些侦听器都不能与tasklet一起使用。
我想要的只是在我的tasklet执行后的一个事件,无论它是否抛出异常。有可能吗?它似乎不支持API。
编辑:响应@danidemi我正在使用程序化API注册监听器和tasklet,如下所示:
steps.get(name)
.listener(listener)
.tasklet(tasklet)
.build()
其中steps
是StepBuilderFactory
的实例。
答案 0 :(得分:3)
你可以
或StepExecutionListener.afterStep(StepExecution stepExecution)
查询stepExecution.getFailureExceptions()
答案 1 :(得分:0)
我想现在为时已晚。但是我最近遇到了这个问题。使用ChunkListener可以更轻松地处理异常,但是可以通过Tasklet的RepeatStatus execute(StepContribution s, ChunkContext chunkContext)
方法来完成异常处理(嗯,这是Tasklet
接口具有^^的唯一方法)。您需要一个try/catch
块来捕获异常。但是,您将需要再次throw
捕获的异常才能回滚事务。
这是一个代码片段。就我而言,如果由于数据库服务器关闭而无法读取某些数据,我必须停止作业。
@Override
public RepeatStatus execute(StepContribution s, ChunkContext chunkContext){
try{
getAllUsersFromDb(); // some operation that could throw an exception
// doesn't hurt to put all suspicious codes in this block tbh
}catch(Exception e){
if(e instanceof NonSkippableReadException){
chunkContext.getStepContext().getStepExecution().getJobExecution().stop();
}
throw e;
}
return RepeatStatus.FINISHED;
}