若依-单呆板多服务器定时使命重复实行问题解决-分布式锁 ...

打印 上一主题 下一主题

主题 677|帖子 677|积分 2031

1.定位定时使命所走方法



  • 打方法断点
   任意找一个定时使命的方法类,打断点检察实行过程
  



  • 实行方法
   点击立刻实行,实行该方法
  



  • 定位方法
   点击步过,寻找符合的代码位置增长分布式锁
  

   最终看到方法在此处进行返回,我们可以再此处进行加锁操作
  

2.添加分布式锁



  • 引入redisson依赖,添加配置类
   在ruoyi-common pom引入redisson依赖
  1. <!--Redisson redis若依已经引入-->
  2. <dependency>
  3.     <groupId>org.redisson</groupId>
  4.     <artifactId>redisson</artifactId>
  5.     <version>3.17.4</version>
  6. </dependency>
复制代码
  添加配置类
  1. package com.ruoyi.common.core.redis;
  2. import org.redisson.Redisson;
  3. import org.redisson.api.RedissonClient;
  4. import org.redisson.config.Config;
  5. import org.springframework.beans.factory.annotation.Value;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. /**
  9. * @Author Cxt
  10. * @Description redisson配置
  11. * @Date 2023/6/29 15:47
  12. * @Version 1.0
  13. */
  14. @Configuration
  15. public class RedissonConfig {
  16.     @Value("${spring.redis.host}")
  17.     private String host;
  18.     @Value("${spring.redis.port}")
  19.     private String port;
  20.     @Value("${spring.redis.password}")
  21.     private String password;
  22.     @Bean
  23.     public RedissonClient redissonClient() {
  24.         Config config = new Config();
  25.         // 配置Redisson连接信息
  26.         config.useSingleServer().setAddress("redis://" + host + ":" + port).setPassword(null);
  27.         return Redisson.create(config);
  28.     }
  29. }
复制代码


  • 引入redisson服务

   如果开启了ScheduleConfig类 注入方式请改为如下图所示注入
  



  • 修改原有的方法
在处理好sysJob对象后 根据使命名称来创建锁对象
  1. @Override
  2. public void execute(JobExecutionContext context) throws JobExecutionException
  3. {
  4.     SysJob sysJob = new SysJob();
  5.     BeanUtils.copyBeanProp(sysJob, context.getMergedJobDataMap().get(ScheduleConstants.TASK_PROPERTIES));
  6.     try
  7.     {
  8.         before(context, sysJob);
  9.         if (sysJob != null)
  10.         {
  11.             //创建锁对象
  12.             RLock lock = redissonClient.getLock(ScheduleConstants.TASK_PROPERTIES);
  13.             //尝试获取锁
  14.             boolean isLock = lock.tryLock();
  15.             if (!isLock){
  16.                 throw new ServiceException("该任务正在执行中!");
  17.             }
  18.             try{
  19.                 //真正执行的方法
  20.                 doExecute(context, sysJob);
  21.             }finally {
  22.                 //释放锁
  23.                 lock.unlock();
  24.             }
  25.         }
  26.         after(context, sysJob, null);
  27.     }
  28.     catch (Exception e)
  29.     {
  30.         log.error("任务执行异常  - :", e);
  31.         after(context, sysJob, e);
  32.     }
  33. }
复制代码
3.测试

同一时间如果拿不到锁将会直接失败,成功达到效果

特别注意

   在拿到锁之后,由于走的是本地缓存,为了克制重复实行,请将使命策略改为放弃实行
   

官方方法

   取消注释类ScheduleConfig即可(注意检察相关表是否存在)
  


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

乌市泽哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表