Spring batch Spring批处理:Tasklet引发异常时的侦听器事件

Spring batch Spring批处理:Tasklet引发异常时的侦听器事件,spring-batch,Spring Batch,我使用了一个tasklet和一个StepExecutionListener,但是对于我的tasklet抛出异常的情况,似乎没有侦听器回调。对于其他各种监听器类型—ChunkListener、ItemProcessListener,等等,这些监听器中没有一个可以与Tasklet一起工作 我想要的只是在我的tasklet执行之后的一个事件,不管它是否引发了异常。有可能吗?API中似乎不支持它 编辑:响应@danidemi我正在使用编程API注册侦听器和tasklet,如下所示: steps.get(

我使用了一个tasklet和一个
StepExecutionListener
,但是对于我的tasklet抛出异常的情况,似乎没有侦听器回调。对于其他各种监听器类型—
ChunkListener
ItemProcessListener
,等等,这些监听器中没有一个可以与Tasklet一起工作

我想要的只是在我的tasklet执行之后的一个事件,不管它是否引发了异常。有可能吗?API中似乎不支持它

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

steps.get(name)
     .listener(listener)
     .tasklet(tasklet)
     .build()
其中
steps
StepBuilderFactory

的一个实例,您可以

  • 将异常管理到tasklet中
  • 将错误存储到执行上下文/外部bean中
  • 管理来自stepExecutionListener的错误

  • 或者在
    StepExecutionListener.afterStep(StepExecution-StepExecution)
    查找到我想现在太迟了。但我最近遇到了这个问题。使用ChunkListener处理异常更容易,但是异常处理可以在Tasklet的
    RepeatStatus execute(StepContributions,ChunkContext ChunkContext)
    方法中完成(这是
    Tasklet
    接口拥有的唯一方法)。您需要的是一个
    try/catch
    块来捕获异常。但是,您需要再次抛出捕获的异常,以便回滚事务。 下面是一段代码片段。在我的例子中,如果由于数据库服务器关闭而无法读取某些数据,我必须停止作业

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

    我想是的。问题是,如果您希望异常停止作业,那么您将被迫使用流或决策器下游。为什么
    StepExecutionListener
    适用于您的用例?我可以问一下您是如何将StepExecutionListener注册到Tasklet的吗?@danidemi我是这样注册的:steps.get(name).listener(listener).tasklet(tasklet).build()argh,抱歉。看起来注释中不支持降价。我想这个解决方案增加了不必要的复杂性,而且容易出错,因为您需要记住在代码的每一步都使用try/catch块