之前分享过分布式定时任务的技术选型方案:分布式定时任务技术选型方案,个人青睐xxl_job,分享了搭建接入流程:xxl_job搭建方案,本次项目需求较为简单,同时时间紧张。下面介绍利用Redis锁实现分布式定时任务的方案。
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
String cron() default "";
String zone() default "";
long fixedDelay() default -1;
String fixedDelayString() default "";
long fixedRate() default -1;
String fixedRateString() default "";
long initialDelay() default -1;
String initialDelayString() default "";
}
cron
@Scheduled(cron = "0/2 * * * * ?")
从0秒开始,每隔两秒执行一次。
zone
@Scheduled(cron = "0/2 * * * * ?", zone = "GMT-8:00")
从0秒开始,每隔两秒执行一次。
指定时间使用的时区为东八区。
fixedRate
@Scheduled(fixedRate = 1000)
1秒执行一次,上次执行开始后过1秒执行下一次。若到了1秒后但上次执行还未完成,会加入worker队列,等待上一次执行完成后,马上执行下一次。
fixedRateString
@Scheduled(fixedDelayString = "1000")
@Scheduled(fixedDelayString = "PT1S")
都表示1秒执行一次,上次执行开始后过1秒执行下一次。若到了1秒后但上次执行还未完成,会加入worker队列,等待上一次执行完成后,马上执行下一次。
fixedDelay
@Scheduled(fixedDelay = 1000)
秒执行一次,上次执行完成后过1秒继续执行下一次。
fixedDelayString
@Scheduled(fixedDelayString = "1000")
@Scheduled(fixedDelayString = "PT1S")
都表示1秒执行一次,上次执行完成后过1秒继续执行下一次。
initialDelay
@Scheduled(initialDelay = 5000, fixedRate = 2000)
首次5秒后执行,后续每隔2秒执行一次(遵循fixedRate 规则)
@Scheduled(initialDelay = 5000, fixedDelay = 2000)
首次5秒后执行,后续每隔2秒执行一次(遵循fixedDelay 规则)
注意:initialDelay、initialDelayString都不能和cron一起使用
initialDelayString
@Scheduled(initialDelayString = "5000", fixedRate = 2000)
首次5秒后执行,后续每隔2秒执行一次(遵循fixedRate 规则)
@Scheduled(initialDelayString = "5000", fixedDelay = 2000)
首次5秒后执行,后续每隔2秒执行一次(遵循fixedDelay 规则)
注意:initialDelay、initialDelayString都不能和cron一起使用
org.redisson
redisson
3.13.5
@Scheduled(cron = "0 0 23 * * ?")
public void statistics() {
RLock lock = redissonClient.getLock("cron_statistics");
boolean lockResult = false;
try {
if (lockResult = lock.tryLock()) {
log.info("每天23点执行一次任务开始!");
}
} catch (Exception e) {
e.printStackTrace();
log.error("每天23点执行一次任务失败{}", e);
} finally {
if (lock.isHeldByCurrentThread() && lockResult && lock != null) {
lock.unlock();
}
}
}
@EnableScheduling
如果有帮助,请多多点赞关注支持哦