您的位置:首页 > 房产 > 建筑 > 专业app开发_宁波品牌网站设计价格_北京seo服务商_百度allin 人工智能

专业app开发_宁波品牌网站设计价格_北京seo服务商_百度allin 人工智能

2025/7/31 23:17:14 来源:https://blog.csdn.net/weixin_43691884/article/details/147094668  浏览:    关键词:专业app开发_宁波品牌网站设计价格_北京seo服务商_百度allin 人工智能
专业app开发_宁波品牌网站设计价格_北京seo服务商_百度allin 人工智能

背景

在一个有多个服务实例的分布式系统中,如果你用 @Scheduled 来定义定时任务,所有实例都会执行这个任务。ShedLock 的目标是只让一个实例在某一时刻执行这个定时任务。

使用步骤

引入依赖

当前以redisTemplate为例子,MongoDB、Zookeeper、JDBC都可以但是需要建表

需要注意java1.8需要使用4.42.0,java17使用5.10.0不然会报错
Spring常见错误:类文件具有错误的版本 61.0, 应为 52.0

<dependency><groupId>net.javacrumbs.shedlock</groupId><artifactId>shedlock-provider-redis-redisson</artifactId><version>4.42.0</version>
</dependency>
<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>4.42.0</version>
</dependency>

增加配置类

package com.platform.common.redis.configure;import net.javacrumbs.shedlock.core.LockProvider;
import net.javacrumbs.shedlock.provider.redis.spring.RedisLockProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;@Configuration
public class ShedLockConfig {@Beanpublic LockProvider lockProvider(RedisConnectionFactory redisConnectionFactory) {// 创建 Redis 锁提供者,使用 RedisConnectionFactoryreturn new RedisLockProvider(redisConnectionFactory);}
}

启用ShedLock,在启动类上增加@EnableSchedulerLock注解

@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")
@SpringBootApplication
public class PlatFormRsyncApplication implements CommandLineRunner 

定时任务的使用,在@Scheduled下增加@SchedulerLock注解

需要注意所有@SchedulerLock修饰的方法必须为public,因为需要序列化

@Scheduled(fixedRateString = "${task.fsOrgPersonRsyncTask.fixedRate}")
@SchedulerLock(name = "myTask", lockAtMostFor = "PT30S", lockAtLeastFor = "PT5S")
public void fsOrgPersonRsyncTask() {

name:任务唯一标识(必须)

  • lockAtMostFor:最多锁定多久(即使服务挂了,锁也会过期)
  • lockAtLeastFor:至少锁定多久(任务执行太快也保持锁一段时间)

格式支持 ISO-8601,例如:

  • “PT30S” 表示 30 秒
  • “PT5M” 表示 5 分钟

工作原理

不需要手动创建 Redis key,ShedLock 会自动处理
在这里插入图片描述


锁的获取:

  • 当某个服务器尝试执行定时任务时,ShedLock 会尝试在 Redis 中为该任务设置一个锁(通过设置一个具有过期时间的键)。
  • 如果 Redis 中没有该锁,ShedLock 就会成功地为该任务设置锁,表明该服务器成功获得了执行任务的权限。
  • 如果 Redis 中已经存在该锁(表示其他服务器正在执行该任务),那么当前尝试获取锁的服务器就无法获取到锁。此时,该服务器不会执行任务,它会等待锁释放。

任务执行:

  • 获取到锁的服务器会执行定时任务。在任务执行期间,其他服务器无法获得锁,因此不能执行相同的任务。

锁的释放:

  • 任务执行完成后,获取到锁的服务器会释放锁(ShedLock 会自动处理锁的过期和释放)。锁的过期时间是由 lockAtMostFor 属性控制的,如果任务执行时间较短,锁会提前过期释放。

其他服务器:

  • 其他服务器一开始获取不到锁时会等到下次尝试。通常,它们会继续等待锁的释放,或者根据配置的定时任务周期(例如 @Scheduled(cron = “0 */1 * * * ?”))再次尝试获取锁。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com