Spring Batch中监听器的执行顺序(6)
我的项目正在使用Spring Batch 6.0.3版本。
我的步骤有2 个 StepExecutionListener,如下所示:
@Bean(name = "myStep")
public Step myStep(JobRepository jobRepository, PlatformTransactionManager transactionManager,
@Qualifier("myFirstListener") MyFirstListener myFirstListener,
@Qualifier("mySecondListener") MySecondListener mySecondListener,
@Qualifier("myTasklet") MyTasklet myTasklet) {
return new StepBuilder("myStep", jobRepository) //
// The step always runs even if the job is restarted and the status was
// COMPLETED before
.allowStartIfComplete(true) //
.tasklet(myTasklet, transactionManager) //
.listener(myFirstListener) //
.listener(mySecondListener) //
.build();
}
我不明白为什么,在每个监听器的 afterStep() 方法中添加了一些日志后,第二个监听器会先于第一个被执行。这正常吗?
08:33:54.958 [main] INFO c.a.o.b.m.MySecondListener [requestId:BATCH-7617dc68-4014-4020-9dff-d9a07c594d09] - MySecondListener.afterStep()
08:33:54.959 [main] INFO c.a.o.b.l.MyFirstListener [requestId:BATCH-7617dc68-4014-4020-9dff-d9a07c594d09] - Step myStep ended with status=COMPLETED, exitStatus=COMPLETED, readCount=1, filterCount=0, writeCount=1, readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=1, rollbackCount=0.
我原以为在调用 afterStep() 方法时,监听器的执行顺序会被遵循。否则,在不添加日志的情况下,要达到监听器的期望顺序会很困难(例如,我有一个监听器来处理异常,在发生任一错误时返回 ExitStatus.FAILED,另一个监听器用来记录步骤的结果)。
解决方案
在Spring Batch中,监听器执行顺序并不能得到保证。
如果你想维持监听器的执行顺序,可以使用 @Order或 Ordered 接口
@Component
@Order(1) // This will run first
public class MyFirstListener implements StepExecutionListener
@Component
@Order(2) // This will run 2nd
public class MySecondListener implements StepExecutionListener {
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。