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