@Retryable 和 @Scheduled 不会触发

@Retryable with @Scheduled don't fire

我编写了一个 Spring 启动应用程序,其中启用了 Spring 批处理计划和 Retriable,如下所示:

@SpringBootApplication
@EnableBatchProcessing
@EnableScheduling
@EnableRetry
public class FilldashboardApp {

}

我定义了一个控制器如下:

@Component
public class JobRunnerStats {

    @Scheduled(cron = "0 0/2 * ? * *")
    @Retryable(maxAttempts = 10, backoff = @Backoff(delay = 1000))
    protected JobExecution runJob() throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException {
        JobParameters jobParameters = null;
        if (this.jobParameters == null) {
            jobParameters = buildJobParameters(null);   
        } else {
            jobParameters = this.jobParameters;
            this.jobParameters = null;
        }
    
        return simpleJobLauncher.run(this.jobStats, jobParameters);
    }

}

2 分钟后,由于指定的 cron 表达式启动了作业,因此在第一步中我将异常发送它,因此在作业执行和步骤中我跟踪了 FAILED 状态.

因此,正如@Retryable 注释所解释的那样,我正在等待 1 秒(延迟 = 1000 微秒)后调用该作业,但方法中的下一次访问是在 2 分钟后(因此,当 cron 表达式具有匹配)

我不知道我错在哪里

您是否尝试将所有预期的异常都包含为可重试参数?

  @Retryable(maxAttempts = 10, backoff = @Backoff(delay = 1000),value={JobExecutionAlreadyRunningException.class})

我阅读了一些教程,但不确定在未指定异常(预期)时可重试的行为如何

在 Spring 上检查 this issue 重试。 您遇到的问题很可能是 Spring 错误 (SPR-16196) 仅在版本 4.3.14、5.0.3 中修复 我在不使用 Spring Batch 的情况下尝试了您的代码段,它工作正常。

@Component
public class TestComponent {
    
    Logger logger = LoggerFactory.getLogger(TestApplication.class);

    @Retryable(maxAttempts = 10, backoff = @Backoff(delay = 1000))
    @Scheduled(cron = "0 0/2 * ? * *")
    public void foo() {
        logger.info("foo");
        throw new RuntimeException("runtime");
    }
}