ShedLock的使用

通常,我们在公司里的部分对外服务都是多集群多节点部署的。同时我们可能一些拆分的不是很细的服务,里面混杂着一些定时任务。

而定时任务中,有些业务为了防止同一时间并发操作,我们就用到了“分布式锁”。
一般最简单的方法我们就是使用redis加锁机制来实现分布式锁
这里我我们使用ShedLock来在定时任务中实现分布式锁

maven

        <dependency>
            <groupId>net.javacrumbs.shedlock</groupId>
            <artifactId>shedlock-spring</artifactId>
            <version>4.3.0</version>
        </dependency>
        <dependency>
            <groupId>net.javacrumbs.shedlock</groupId>
            <artifactId>shedlock-provider-redis-jedis</artifactId>
            <version>4.3.0</version>
        </dependency>
配置LockProvider
单节点测试
    @Bean
    public JedisPool createJedisCluster() {
    	// 因为我是本地测试的代码,所以使用的是jedisPool
        JedisCluster jedisCluster = new JedisCluster(hostAndPorts);
        JedisPool jedisPool = new JedisPool();
        return jedisPool;
    }

    @Bean
    public LockProvider createLockProvider(JedisPool jedisPool) {
        JedisLockProvider jedisLockProvider = new JedisLockProvider(jedisPool);
        return jedisLockProvider;
    }
集群测试
    @Bean
    public JedisCluster createJedisCluster() {
        HashSet<HostAndPort> hostAndPorts = new HashSet<>();
        hostAndPorts.add(new HostAndPort("ip", port));
        JedisCluster jedisCluster = new JedisCluster(hostAndPorts);
        return jedisCluster;
    }
	
	@Bean
    public LockProvider createLockProvider(JedisCluster jedisCluster) {
        JedisLockProvider jedisLockProvider = new JedisLockProvider(jedisCluster);
        return jedisLockProvider;
    }
开启SchedLock
@SpringBootApplication
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(SpringApplication.class, args);
    }
}
创建定时任务
@Component
class BaeldungTaskScheduler {

    @Scheduled(cron = "0 0/15 * * * ?")
    @SchedulerLock(name = "TaskScheduler_scheduledTask", 
      lockAtLeastForString = "PT5M", lockAtMostForString = "PT14M")
    public void scheduledTask() {
        // ...
    }
}
参数说明

@SchedulerLock注解主要参数:
name:锁的名称,必须保证唯一;
lockAtMostFor:成功执行任务的节点所能拥有的独占锁的最长时间,设置的值要保证比定时任务正常执行完成的时间大一些;
lockAtLeastFor:成功执行任务的节点所能拥有的独占锁的最短时间,其主要目的是任务执行时间可能很短,防止多个节点执行。
@EnableSchedulerLock注解主要参数:
defaultLockAtMostForlockAtMostFor的默认时间;
defaultLockAtLeastForlockAtLeastFor的默认时间。

ISO8601时间格式

格式解析
R2/2023-06-04T20:15:14.765432+08:00/P1DT10S

上面的字符串通过"/"分为了三部分即:

重复次数/开始时间/运行间隔

重复次数

R - 将永远重复
R1 - 将重复一次
R23 - 将重复23次。

开始时间

其中"T"用来分割日期和时间,时间后面跟着的"+08:00"表示东八区,注意"+"是连字符,不是加号。
时区默认是0时区,可以用"Z"表示,也可以不写。
上面的字符串表示 2023年6月4日,20点15分14秒765432纳秒,东八区。

运行间隔

运行间隔以"P"开始,和上面一样也是用"T"分割日期和时间,如P2Y2M10DT2H30M15S

  • P     开始标记

  • 2Y    两年

  • 2M   两个月

  • 10D  十天

  • T       时间和日期分的割标记

  • 2H     两个小时

  • 30M   三十分钟

  • 15S   十五秒钟

例子,注意如果没有年月日,"T"也不能省略

P1DT1M     一天一分钟执行一次
P1W            一周执行一次
PT1H           一小时执行一次
PT10S          十秒执行一次

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的 ShedLock 结合 Spring Boot 使用的示例: 1. 添加依赖 在 `pom.xml` 文件中添加以下依赖: ```xml <dependency> <groupId>net.javacrumbs.shedlock</groupId> <artifactId>shedlock-spring</artifactId> <version>4.23.0</version> </dependency> ``` 2. 配置数据库 在 `application.properties` 文件中配置数据库连接信息,例如: ``` spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=123456 ``` 3. 创建定时任务 在 Spring Boot 应用程序中创建一个定时任务,例如: ```java @Component public class MyTask { @Scheduled(cron = "0 0/5 * * * ?") @SchedulerLock(name = "myTask", lockAtMostFor = "5m", lockAtLeastFor = "1m") public void run() { // do something } } ``` 在这个例子中,我们创建了一个名为 `MyTask` 的定时任务。使用 `@Scheduled` 注解指定了任务的执行时间,同时使用 `@SchedulerLock` 注解指定了任务的锁定策略。其中,`name` 参数指定了任务的名称,`lockAtMostFor` 参数指定了任务最多可以被锁定的时间,`lockAtLeastFor` 参数指定了任务最少需要被锁定的时间。 4. 启用 ShedLockSpring Boot 应用程序的启动类上添加 `@EnableSchedulerLock` 注解,例如: ```java @SpringBootApplication @EnableSchedulerLock(defaultLockAtMostFor = "PT30S") public class MyApp { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } } ``` 在这个例子中,我们使用 `@EnableSchedulerLock` 注解启用了 ShedLock,并指定了默认的最大锁定时间为 30 秒。 5. 运行应用程序 运行 Spring Boot 应用程序,并查看日志信息。如果一切正常,你应该可以看到 ShedLock 所输出的日志信息,其中包括任务被锁定的时间信息等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值