ShedLock锁

  ShedLock是一个锁,官方解释是他永远只是一个锁,并非是一个分布式任务调度器。一般shedLock被使用的场景是,你有个任务,你只希望他在单个节点执行,而不希望他并行执行,而且这个任务是支持重复执行的。如对某些查询出来的数据打标签,没有任何的事务性处理操作。以上,官方的解释比较拗口,具体可以参见github上的wiki。

  我的理解,ShedLock是一个悲观锁,而无论悲观锁还是乐观锁,他的实现,必须借助于公共存储。


简易结构.png

  所以,对于shedLock,需要实现分布式锁,他也需要借助于共享存储,目前支持如下几种方式:


共享存储支持.png

所以,这个和zookeeper或者redis的理论基本类似。只是这个shedLock封装的更好,不需要我们去实现过多的客户端。而像zookeeper或者redis,需要我们自己实现。具体可以看我之前写的那篇《任务调度总结》文章。还有我github或者码云上的sample。

  shedLock支持注解,和spring结合使用更简单。我们来看看他的使用方式。我们以共享存储使用mysql为例子:

  • 首先,需要在你的项目中引入两个包,假设项目是maven构建:
        <dependency>
            <groupId>net.javacrumbs.shedlock</groupId>
            <artifactId>shedlock-spring</artifactId>
            <version>2.1.0</version>
        </dependency>
        <dependency>
            <groupId>net.javacrumbs.shedlock</groupId>
            <artifactId>shedlock-provider-jdbc-template</artifactId>
            <version>2.2.0</version>
        </dependency>
  • 其次,在你的启动类中增加注解支持。
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")

稍后会说明下,这个lockatMostFor的含义。

  • 下一步,需要初始化Provider支持。操作数据库。
@Configuration
public class LockProviderConfiuration {

    @Autowired DataSource dataSource;
    
    @Bean
    public LockProvider lockProvider () {
        return new JdbcTemplateLockProvider(dataSource);
    }
}

这里全局datasource需要事先创建好。在这里可以直接注入使用。然后实例化jdbcTemplateLockProvider。

  • 建表
CREATE TABLE shedlock(
    name VARCHAR(64), 
    lock_until TIMESTAMP(3) NULL, 
    locked_at TIMESTAMP(3) NULL, 
    locked_by  VARCHAR(255), 
    PRIMARY KEY (name)
)

相信看到这里大家都明白了,name是全局唯一的。用这个来标识全局唯一的定时任务。用此来变相实现一个悲观锁。

  • 以上做好了后,可以开始写你的定时任务了,我们这里写一个测试类
@Component
public class RiskAdminScheduler {

    private static final String SIXTY_MIN = "PT60M";
    private static final String THREE_MIN = "PT3M";

    @Scheduled(cron = "0 */1 * * * ? ")
    @SchedulerLock(name = "test",lockAtLeastForString = THREE_MIN,lockAtMostForString = SIXTY_MIN)
    public void test() {
        System.out.println(LocalDateTime.now());
        System.out.println(Thread.currentThread().getName()+"--executed......");
    }
}

@Scheduler(cron=xxxx) 这个是spring的定时任务触发器。每分钟跑一次。
@SchedulerLock这个是shedlock的注解方式。
  name的含义:定时任务的名称。这个必须全局唯一。这个是定时任务的标识。
   lockAtLeastForString & lockAtMostForString我想引用官方的解释更明白一点:By setting lockAtMostFor we make sure that the lock is released even if the node dies and by setting lockAtLeastFor we make sure it's not executed more than once in fifteen minutes.
意思就是,当节点挂掉后,这个锁还是要释放的。最长时间就是most设置的,和zookeeper中的临时节点相似,和redis设置超时时间类似。而为了防止集群启动的先后或者各节点 没有做时钟同步,用了least来防止这种情况下,重复起任务的状况。
  这里需要注意的是,least时间设置了后,比如我这里是1分钟定时任务执行一次,而least设置是2分钟。那么也就是2分钟是持有锁的最小时间,2分钟后才释放。所以1分钟执行完的定时任务,必须等到2分钟结束,锁释放后,才能再次执行。当然,实际我们业务中不会出现这种每分钟执行的业务相关的定时任务,即使有,那么情况也比较,比如快速掉单查询,以前做支付的时候,那也是支持并发的,不需要分布式锁的。这里提醒下大家注意下使用场景。大部分场景我们还是可以用这个shedlock的。
  我们看下表中的数据:

lock table.png

很明显,持有时间是21:06,释放时间是21:09,就是least设置的时间。大家使用的时候注意下。

  好了,下次有时间再讲解下他的内部实现。

  工作和生活的乐趣在于分享和总结。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容