第一步. 自动配置类

  • 主启动类添加:@EnableScheduling //开启定时任务

aop和redis  POM添加:

    <!--redis驱动--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--aop面向切面编程--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

自定义分布式定时任务注解

/*** @program:* @description: 定时任务锁* @author: wangZhiDong* @created: 2021/11/29 09:06*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TaskLock {/*** 定时任务名称* @return*/String name() default "";/*** redis缓存key值* @return*/String key();/*** 过期时间单位s (自动解锁时间,防止死锁)* @return*/int expired();/*** 执行完毕是否解锁* @return*/boolean unLock() default true;}

定义 分布式定时任务 切面具体实现

/*** @program:* @description: 定时任务锁切面* @author: wangZhiDong* @created: 2021/10/29 09:12*/
@Aspect
@Component
@Slf4j
@AllArgsConstructor
@Order(10)
public class TaskLockAspect {private RedisTemplate redisTemplate;@Pointcut("@annotation(com.wang.timedtask.annotation.TaskLock)")public void TaskLockAspect() {}@Around("TaskLockAspect() && @annotation(taskLock)")public Object doAround(ProceedingJoinPoint proceedingJoinPoint,TaskLock taskLock) throws Throwable {String value = UUID.randomUUID().toString();try {if (lock(taskLock.key(), value, taskLock.expired())) {return proceedingJoinPoint.proceed();}} catch (Exception e) {log.error("定时任务执行失败,{}", taskLock.key(), e);} finally {// 执行完毕解除锁if (!taskLock.unLock()) {return null;}String lockValue = getLockValue(taskLock.key());if (StringUtils.isEmpty(lockValue) || !lockValue.equals(value)) {return null;}// 解锁设置为延时1SunLock(taskLock.key());}return null;}/*** 加锁* @param key* @param value* @param time* @return*/public boolean lock(String key , String value , int time){return redisTemplate.opsForValue().setIfAbsent(key , value , time , TimeUnit.SECONDS);}/*** 解锁* @param key*/public void unLock(String key){redisTemplate.expire(key , 1 , TimeUnit.SECONDS);}/*** 获取锁值* @param key* @return*/public String getLockValue(String key){return (String) redisTemplate.opsForValue().get(key);}
}

简单使用

/*** @Author wangZhiDong* @Date 2021/8/22* 启动数据纠正**/
@Slf4j
@Component
public class TransferService {public static int num = 0;DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");@Scheduled(cron = "0/5 * * * * ?")@TaskLock(name = "测试分布式定时任务5秒执行一次", key = "test_task",expired = 5)public void start(){num++;System.out.println(LocalDateTime.now().format(formatter)+"第"+num+"次执行的是第一个");}/*** 使用 public 的 定时任务才行*/@Scheduled(cron = "0/5 * * * * ?")@TaskLock(name = "测试分布式定时任务5秒执行一次", key = "test_task",expired = 5)public void start2(){TransferService.num++;System.out.println(LocalDateTime.now().format(formatter)+"第"+TransferService.num+"次执行的是第二个");}@Scheduled(cron = "0/5 * * * * ?")@TaskLock(name = "测试分布式定时任务5秒执行一次", key = "test_task",expired = 5)public void start3(){TransferService.num++;System.out.println(LocalDateTime.now().format(formatter)+"第"+TransferService.num+"次执行的是第三个");}}

执行结果:

2021-12-01 14:35:40第1次执行的是第一个
2021-12-01 14:35:45第2次执行的是第二个
2021-12-01 14:35:50第3次执行的是第三个
2021-12-01 14:35:55第4次执行的是第三个
2021-12-01 14:36:00第5次执行的是第二个
2021-12-01 14:36:05第6次执行的是第一个
2021-12-01 14:36:10第7次执行的是第三个
2021-12-01 14:36:15第8次执行的是第一个
2021-12-01 14:36:20第9次执行的是第二个
2021-12-01 14:36:25第10次执行的是第三个
2021-12-01 14:36:30第11次执行的是第一个
...

spring boot基于redis的分布式定时任务相关推荐

  1. Spring boot基于redis实现附近的人(附源码下载)

    此文章是针对去年写的Java基于Redis实现"附近的人 进行业务优化! 核心源码 public class NearbyPO {@NotNull(message = "id值不能 ...

  2. Spring Boot基于KLock实现分布式锁的使用详解(一)

    目录 一.背景 二.maven依赖 三.配置 3.1.单节点配置 3.2.集群配置 四.源码及使用 4.1.源码-Klock(<font color=#FF0000>核心注解</fo ...

  3. spring boot shiro redis整合基于角色和权限的安全管理-Java编程

    一.概述 本博客主要讲解spring boot整合Apache的shiro框架,实现基于角色的安全访问控制或者基于权限的访问安全控制,其中还使用到分布式缓存redis进行用户认证信息的缓存,减少数据库 ...

  4. 基于redis的分布式任务管理

    业务背景 系统中有各种定时任务,需要满足以下要求: 定时任务需要能够动态增删改查 需要能够设置任务的有效时间范围(只在此范围内执行) 任务执行周期需要能够灵活配置 需要能够轻松接入各种任务实现 需要能 ...

  5. redis使用sysc超时_基于redis的分布式锁实现

    随着业务越来越复杂,应用服务都会朝着分布式.集群方向部署,而分布式CAP原则告诉我们,Consistency(一致性). Availability(可用性).Partition tolerance(分 ...

  6. Linux 安装Redis-6.2.5,配置及使用(RDB与AOF持久化、sentinel机制、主从复制、Spring Boot 集成 Redis)

    CentOS 7 安装Redis-6.2.5版本 Redis采用的是基于内存的单进程 单线程模型 的KV数据库,由C语言编写.官方提供的数据是可以达到100000+的qps 应用场景: 令牌(Toke ...

  7. 170222、使用Spring Session和Redis解决分布式Session跨域共享问题

    使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...

  8. redis延迟队列 实现_灵感来袭,基于Redis的分布式延迟队列(续)

    背景 上一篇(灵感来袭,基于Redis的分布式延迟队列)讲述了基于Java DelayQueue和Redis实现了分布式延迟队列,这种方案实现比较简单,应用于延迟小,消息量不大的场景是没问题的,毕竟J ...

  9. Java基于redis实现分布式锁(SpringBoot)

    前言 分布式锁,其实原理是就是多台机器,去争抢一个资源,谁争抢成功,那么谁就持有了这把锁,然后去执行后续的业务逻辑,执行完毕后,把锁释放掉. 可以通过多种途径实现分布式锁,例如利用数据库(mysql等 ...

最新文章

  1. 六一:如何在Datawhale开源学习小程序中管
  2. NetBeans Java EE技巧3:数据库中的RESTful Web服务
  3. 经典的机器学习方面源代码库(非常全,数据挖掘,计算...)
  4. [LeetCode]819. 最常见的单词
  5. linux 防火墙添加6309端口,关于在linux下部署垂直集群的问题
  6. office起动缓慢_如何解决Microsoft Outlook启动缓慢的问题
  7. 执行taosdemo发生错误Unable to establish connection
  8. ”周期天王”20大预言,针针见血,看完整个人通透多了
  9. Stop Staring: Facial Modeling and Animation Done Right
  10. SolidWorks 2023软件安装教程SW2023软件安装包
  11. win10系统下载中文版 64位32位 官方版​
  12. git由ssh改为http后,HTTP Basic: Access denied无法同步问题解决
  13. 心怀远方,顶峰相见!!!
  14. RTSP 协议漫谈,揭秘 RTSP 协议内幕
  15. React.createElement的理解使用
  16. MySQL 基础——MySQL 起步
  17. 分开旅行—没有什么失恋是一场旅行解决不了的
  18. 使用whistle进行API代理
  19. burpsuite进行第一次爬行审计
  20. 淘宝(客户端)上的店家里面的视频是如何下载的

热门文章

  1. matlab simhash,最大非负的序列和 - 轻舞凋零的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. 判断一个大整数能否被11整除
  3. html隐藏链接跳转,HTML 链接
  4. 计算机网络知识全面讲解:域名的结构
  5. JSPEL表达式MVC三层结构综合案例
  6. 使用nginx搭建三台tomcat集群
  7. 数据选择器的级联扩展
  8. JavaScript 设计模式之发布-订阅模式(下)
  9. 2019年中国全国5级行政区划(省、市、县(区)、镇(街道)、村)
  10. pdd暑期实习生机试1