java定时锁_用shedlock实现分布式定时任务锁

这个shedlock针对的是spring自带的schedule。

假设你有两台服务器,部署的是同一个项目,如果每个项目都开启定时器任务,那么定时任务会重复执行,占用资源甚至造成数据错乱。或许你可以通过配置文件来开启其中一个项目的定时任务,另一个项目的定时任务不执行。但是这个问题是这个定时任务始终会在同一个服务器上执行,会给这一台服务器造成压力。

解决办法:引入

shedlock

maven 依赖

net.javacrumbs.shedlock

shedlock-spring

2.2.0

net.javacrumbs.shedlock

shedlock-provider-jdbc-template

2.2.0

代码开发

//定义一个配置类

@Configuration

public class ScheduledLockConfig

{

@Bean

public LockProvider lockProvider(DataSource dataSource) {

return new JdbcTemplateLockProvider(dataSource);

}

}

//在启动类上加上注解EnableSchedulerLock,开启定时任务锁,指定一个默认的锁的时间

@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")

//定时任务配置

@Component

public class ScheduledLock

{

private static final int lockTime = 1000;

@Scheduled(cron = "0/2 * * * * ?")

@SchedulerLock(name = "TaskScheduler_scheduledTask", lockAtMostFor = lockTime, lockAtLeastFor = lockTime)

public void run()

{

System.out.print(new Date().toString() + "n");

}

}

/**

这个注解有五个参数

name:定时任务的名字,就是数据库中的内个主键

lockAtMostFor:锁的最大时间单位为毫秒

lockAtMostForString:最大时间的字符串形式,例如:PT30S 代表30秒

lockAtLeastFor:锁的最小时间单位为毫秒

lockAtLeastForString:最小时间的字符串形式

*/

数据库配置

在数据库中添加一张名为shedlock表。在定时任务开始时,会更新这两个时间,在时间之内的定时任务是不会被重复执行的。

CREATE TABLE `shedlock` (

`name` varchar(255) NOT NULL,

`locked_at` timestamp NULL DEFAULT NULL,

`lock_until` timestamp NULL DEFAULT NULL,

`locked_by` varchar(255) DEFAULT NULL,

PRIMARY KEY (`name`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

A控制台输出

cc6f12853d415f24f2742b3f77c61d6f.png

B控制台输出

8fcc981228a0eed7b077e6f922fb42c0.png

总结:拿JDBCTemplate进行说明,就是当第一个微服务执行定时任务的时候,会将此定时任务进行锁操作,然后其他的定时任务就不会再执行,锁操作有一定的时长,超过这个时长以后,再一次,所有的定时任务进行争抢下一个定时任务的执行权利,如此循环。其中两个配置lockAtMostFor和lockAtLeastFor,保证了在一个定时任务的区间内只有一个定时任务在执行,同时也保证了即便是其中的一个定时任务挂掉了,到一定的时间以后,锁也会释放,其他的定时任务依旧会进行执行权的争夺,执行定时任务。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值