@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");
}
}
我编写了一个 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");
}
}