Spring Boot中JobRunr定时任务(含重试)全部失败时如何接收通知
实现全重试失败后的通知(JobRunr 5.1.4)
你的需求完全可以通过JobRunr实现,以下是两种可行的解决方案:
方案1:利用JobServerFilter的onFailed方法
JobServerFilter提供了onFailed回调,会在任务执行失败时触发。我们可以在这里判断当前任务的重试次数是否已经达到设定的最大重试次数,若是则发送通知。
修改你的ExceptionFilter如下:
@Component public class ExceptionFilter implements JobServerFilter { private static final Logger log = LoggerFactory.getLogger(ExceptionFilter.class); @Override public void onProcessing(Job job) { log.info("onProcessing: {}", job.getJobName()); log.info(job.getJobState().getName().name()); } @Override public void onProcessed(Job job) { log.info("onProcessed: {}", job.getJobName()); log.info(job.getJobState().getName().name()); } @Override public void onFailed(Job job, Throwable throwable) { log.info("onFailed: {}", job.getJobName()); // 获取设定的最大重试次数 int maxRetries = job.getJobDetails().getRetries(); // 获取已经执行的重试次数(初始失败算第0次,每重试一次加1) int currentRetryCount = job.getNumberOfRetries(); // 当当前重试次数等于最大重试次数时,说明所有重试都失败了 if (currentRetryCount >= maxRetries) { // 这里添加发送通知的逻辑,比如邮件、告警等 log.error("任务【{}】初始执行及所有重试均失败,触发通知", job.getJobName()); // sendNotification(job, throwable); } } }
方案2:利用ApplyStateFilter判断最终失败状态
在ApplyStateFilter的onStateApplied方法中,当任务状态变更为FAILED时,检查是否还有剩余重试次数。如果当前重试次数已经达到最大值,则触发通知。
修改后的代码示例:
@Component public class ExceptionFilter implements ApplyStateFilter { private static final Logger log = LoggerFactory.getLogger(ExceptionFilter.class); @Override public void onStateApplied(Job job, JobState previousState, JobState newState) { log.info("onStateApplied: {}", job.getJobName()); log.info("previousState: {}", previousState.getName().name()); log.info("newState: {}", newState.getName().name()); // 仅当状态变为FAILED时判断 if (JobStateName.FAILED.equals(newState.getName())) { int maxRetries = job.getJobDetails().getRetries(); int currentRetryCount = job.getNumberOfRetries(); if (currentRetryCount >= maxRetries) { // 触发全失败通知 log.error("任务【{}】所有重试已耗尽,触发最终失败通知", job.getJobName()); // sendNotification(job, job.getJobState().getThrowable()); } } } }
关键说明
job.getJobDetails().getRetries():获取你在@Job注解中设置的retries值(示例中为2)job.getNumberOfRetries():记录当前任务已经执行的重试次数,初始失败时为0,每重试一次递增1。当该值等于最大重试次数时,说明所有重试都已完成且失败。
注意:如果你的定时任务是周期性的(@Recurring),每次周期生成的是新的Job实例,上述判断只会针对单个周期内的任务执行+重试流程,不会影响下一个周期的任务。
内容的提问来源于stack exchange,提问作者Markus Bohl
相关产品推荐
相关产品推荐

