当前位置:   article > 正文

spring boot基于redis的分布式定时任务_springboot redistemplate处理分布式任务

springboot redistemplate处理分布式任务

 

第一步. 自动配置类

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

aop和redis  POM添加:

  1. <!--redis驱动-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-data-redis</artifactId>
  5. </dependency>
  6. <!--aop面向切面编程-->
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-aop</artifactId>
  10. </dependency>

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

  1. /**
  2. * @program:
  3. * @description: 定时任务锁
  4. * @author: wangZhiDong
  5. * @created: 2021/11/29 09:06
  6. */
  7. @Target(ElementType.METHOD)
  8. @Retention(RetentionPolicy.RUNTIME)
  9. @Documented
  10. public @interface TaskLock {
  11. /**
  12. * 定时任务名称
  13. * @return
  14. */
  15. String name() default "";
  16. /**
  17. * redis缓存key值
  18. * @return
  19. */
  20. String key();
  21. /**
  22. * 过期时间单位s (自动解锁时间,防止死锁)
  23. * @return
  24. */
  25. int expired();
  26. /**
  27. * 执行完毕是否解锁
  28. * @return
  29. */
  30. boolean unLock() default true;
  31. }

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

  1. /**
  2. * @program:
  3. * @description: 定时任务锁切面
  4. * @author: wangZhiDong
  5. * @created: 2021/10/29 09:12
  6. */
  7. @Aspect
  8. @Component
  9. @Slf4j
  10. @AllArgsConstructor
  11. @Order(10)
  12. public class TaskLockAspect {
  13. private RedisTemplate redisTemplate;
  14. @Pointcut("@annotation(com.wang.timedtask.annotation.TaskLock)")
  15. public void TaskLockAspect() {
  16. }
  17. @Around("TaskLockAspect() && @annotation(taskLock)")
  18. public Object doAround(ProceedingJoinPoint proceedingJoinPoint,TaskLock taskLock) throws Throwable {
  19. String value = UUID.randomUUID().toString();
  20. try {
  21. if (lock(taskLock.key(), value, taskLock.expired())) {
  22. return proceedingJoinPoint.proceed();
  23. }
  24. } catch (Exception e) {
  25. log.error("定时任务执行失败,{}", taskLock.key(), e);
  26. } finally {
  27. // 执行完毕解除锁
  28. if (!taskLock.unLock()) {
  29. return null;
  30. }
  31. String lockValue = getLockValue(taskLock.key());
  32. if (StringUtils.isEmpty(lockValue) || !lockValue.equals(value)) {
  33. return null;
  34. }
  35. // 解锁设置为延时1S
  36. unLock(taskLock.key());
  37. }
  38. return null;
  39. }
  40. /**
  41. * 加锁
  42. * @param key
  43. * @param value
  44. * @param time
  45. * @return
  46. */
  47. public boolean lock(String key , String value , int time){
  48. return redisTemplate.opsForValue().setIfAbsent(key , value , time , TimeUnit.SECONDS);
  49. }
  50. /**
  51. * 解锁
  52. * @param key
  53. */
  54. public void unLock(String key){
  55. redisTemplate.expire(key , 1 , TimeUnit.SECONDS);
  56. }
  57. /**
  58. * 获取锁值
  59. * @param key
  60. * @return
  61. */
  62. public String getLockValue(String key){
  63. return (String) redisTemplate.opsForValue().get(key);
  64. }
  65. }

简单使用

  1. /**
  2. * @Author wangZhiDong
  3. * @Date 2021/8/22
  4. * 启动数据纠正
  5. **/
  6. @Slf4j
  7. @Component
  8. public class TransferService {
  9. public static int num = 0;
  10. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  11. @Scheduled(cron = "0/5 * * * * ?")
  12. @TaskLock(name = "测试分布式定时任务5秒执行一次", key = "test_task",expired = 5)
  13. public void start(){
  14. num++;
  15. System.out.println(LocalDateTime.now().format(formatter)+"第"+num+"次执行的是第一个");
  16. }
  17. /**
  18. * 使用 public 的 定时任务才行
  19. */
  20. @Scheduled(cron = "0/5 * * * * ?")
  21. @TaskLock(name = "测试分布式定时任务5秒执行一次", key = "test_task",expired = 5)
  22. public void start2(){
  23. TransferService.num++;
  24. System.out.println(LocalDateTime.now().format(formatter)+"第"+TransferService.num+"次执行的是第二个");
  25. }
  26. @Scheduled(cron = "0/5 * * * * ?")
  27. @TaskLock(name = "测试分布式定时任务5秒执行一次", key = "test_task",expired = 5)
  28. public void start3(){
  29. TransferService.num++;
  30. System.out.println(LocalDateTime.now().format(formatter)+"第"+TransferService.num+"次执行的是第三个");
  31. }
  32. }

执行结果:

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次执行的是第一个
...

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/728108
推荐阅读
相关标签
  

闽ICP备14008679号