ShedLock-jdbc配置锁

时间:2019-12-19
本文章向大家介绍ShedLock-jdbc配置锁,主要包括ShedLock-jdbc配置锁使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

     项目初期为了快速响应业务开发,对于部分业务需要使用到定时任务功能模块,会直接嵌入到主流程代码中间。当业务增加,发展成分布式服务时,那些定时任务对整体而言重复执行。如果避免分布式服务中的定时任务单一执行,又不需要重新迁移代码另外新开定时任务项目呢?

   shedLock是个非常好的选择。简洁的配置,使用注解不干扰到业务即可实现。相对于其它实现方式而言是最简单的。

   ShedLock可以保证多节点的计划任务同时只执行一次。使用加锁机制让其中一个节点运行计划任务,防止其它节点再次运行此计划任务,其它节点感知计划任务已加锁,不会进行等待状态,而是直接跳过。

  ShedLock使用外部存储机制(如Mongo, JDBC database, Redis, Hazelcast, ZooKeeper)来协调。

  ShedLock并不是分布式锁。它也不完全是分布式计划调度任务。

 

    ShedLock只是提供一种切入机制,真正实现锁的机制由外部存储来提供。ShedLock还有个比较人性化的点,配置参数中必需要有锁的过期时间,防止死锁。

使用ShedLock步骤:

1、配置并激活Scheduled locking

2、注解到计划任务上

3、配置锁的提供者(JDBC、Redis、ZK)

演示如何使用JDBC来配置(非springBoot项目工程)。

添加依赖:

<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
<version>4.0.3</version>
</dependency>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-jdbc-template</artifactId>
<version>4.0.3</version>
</dependency>
@EnableSchedulerLock(defaultLockAtMostFor = "PT30m")
public class ScheduleManager {

@Scheduled(cron = "1 1 */1 * * ?")
@SchedulerLock(name = "runSyncData",lockAtMostFor = "PT30m", lockAtLeastFor = "PT30s")
public void runSyncData(){
//......
}
}

PT为默认值,m/s表示时间单位

us:微秒
ns:纳秒
ms:毫秒
s :秒
m :分钟
h :小时
d :天

lockAtMostFor:计划任务异常死亡后保留最长的时间,没有配置会使用默认defaultLockAtMostFor的值。如果计划任务正常运行完后就会释放锁。此属性时间尽量配置比正常运行时间长一些。

lockAtLeastFor:保留锁的最小时间量。主要目的是防止多节点执行非常短的任务和节点之间的时钟差异。

创建jdbc表

CREATE TABLE shed_lock(
name VARCHAR(64) NOT NULL COMMENT '锁名称',
lock_until TIMESTAMP(3) COMMENT '最大锁保留时间',
locked_at TIMESTAMP(3) COMMENT '使用锁时间',
locked_by VARCHAR(255) COMMENT '服务名称',
PRIMARY KEY (name)
)ENGINE=INNODB DEFAULT CHARSET=UTF8MB4 ;

配置提供者

<bean id="lockProvider" class="net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider">
<constructor-arg name="dataSource" ref="dataSource"/>
</bean>

dataSource是必传参数

如果不使用默认表名shed_lock,可以重置参数:<constructor-arg name="tableName" value="..."/>

---end---

原文地址:https://www.cnblogs.com/song27/p/12066702.html