Spring Batch:Tasklet抛出异常时的侦听器事件

时间:2014-09-11 14:10:49

标签: spring-batch

我正在使用一个tasklet和一个StepExecutionListener但似乎没有监听器回调我的tasklet抛出异常的情况。对于各种其他侦听器类型 - ChunkListenerItemProcessListener等 - 但是这些侦听器都不能与tasklet一起使用。

我想要的只是在我的tasklet执行后的一个事件,无论它是否抛出异常。有可能吗?它似乎不支持API。

编辑:响应@danidemi我正在使用程序化API注册监听器和tasklet,如下所示:

steps.get(name)
     .listener(listener)
     .tasklet(tasklet)
     .build()

其中stepsStepBuilderFactory的实例。

2 个答案:

答案 0 :(得分:3)

你可以

  1. 将异常管理到tasklet
  2. 将错误存储到execution-context / external bean
  3. 从stepExecutionListener管理错误
  4. 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;
}