若依-单呆板多服务器定时使命重复实行问题解决-分布式锁
1.定位定时使命所走方法[*] 打方法断点
任意找一个定时使命的方法类,打断点检察实行过程
https://i-blog.csdnimg.cn/blog_migrate/832fb12b7db1a017b5eef51f0d644278.png
[*] 实行方法
点击立刻实行,实行该方法
https://i-blog.csdnimg.cn/blog_migrate/14a5bd2ef02713be4134294b46378bd9.png
[*] 定位方法
点击步过,寻找符合的代码位置增长分布式锁
https://i-blog.csdnimg.cn/blog_migrate/aaaa7db2dca3f352ac7fd16db776e97f.png
最终看到方法在此处进行返回,我们可以再此处进行加锁操作
https://i-blog.csdnimg.cn/blog_migrate/06969bbb10d5f851b88e83775d37380d.png
2.添加分布式锁
[*] 引入redisson依赖,添加配置类
在ruoyi-common pom引入redisson依赖
<!--Redisson redis若依已经引入-->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.17.4</version>
</dependency> 添加配置类
package com.ruoyi.common.core.redis;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author Cxt
* @Description redisson配置
* @Date 2023/6/29 15:47
* @Version 1.0
*/
@Configuration
public class RedissonConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private String port;
@Value("${spring.redis.password}")
private String password;
@Bean
public RedissonClient redissonClient() {
Config config = new Config();
// 配置Redisson连接信息
config.useSingleServer().setAddress("redis://" + host + ":" + port).setPassword(null);
return Redisson.create(config);
}
}
[*] 引入redisson服务
https://i-blog.csdnimg.cn/blog_migrate/1b2bf7e88ad3638c296da05f56b6e229.png
如果开启了ScheduleConfig类 注入方式请改为如下图所示注入
https://i-blog.csdnimg.cn/blog_migrate/e148e6c54ad4f2abb121651b7d5fd471.png
[*] 修改原有的方法
在处理好sysJob对象后 根据使命名称来创建锁对象
@Override
public void execute(JobExecutionContext context) throws JobExecutionException
{
SysJob sysJob = new SysJob();
BeanUtils.copyBeanProp(sysJob, context.getMergedJobDataMap().get(ScheduleConstants.TASK_PROPERTIES));
try
{
before(context, sysJob);
if (sysJob != null)
{
//创建锁对象
RLock lock = redissonClient.getLock(ScheduleConstants.TASK_PROPERTIES);
//尝试获取锁
boolean isLock = lock.tryLock();
if (!isLock){
throw new ServiceException("该任务正在执行中!");
}
try{
//真正执行的方法
doExecute(context, sysJob);
}finally {
//释放锁
lock.unlock();
}
}
after(context, sysJob, null);
}
catch (Exception e)
{
log.error("任务执行异常- :", e);
after(context, sysJob, e);
}
} 3.测试
同一时间如果拿不到锁将会直接失败,成功达到效果
https://i-blog.csdnimg.cn/blog_migrate/fc83e840a421d69990729f0918db5b73.png
特别注意
在拿到锁之后,由于走的是本地缓存,为了克制重复实行,请将使命策略改为放弃实行
https://i-blog.csdnimg.cn/blog_migrate/eab005071603ac7b61ad7227d104d9d4.png
官方方法
取消注释类ScheduleConfig即可(注意检察相关表是否存在)
https://i-blog.csdnimg.cn/blog_migrate/cb40fdca9631938cee58e27712a37e4e.pnghttps://i-blog.csdnimg.cn/blog_migrate/de591386a5b74fc452bcbef63e48f63c.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]