Spring Batch中监听器的执行顺序(6)

后端开发 2026-07-09

我的项目正在使用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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章