前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring ShedLock指南

Spring ShedLock指南

作者头像
程序猿DD
发布2019-03-08 12:18:42
1.1K0
发布2019-03-08 12:18:42
举报
文章被收录于专栏:程序猿DD程序猿DD

来源:SpringForAll社区

1 概述

Spring为定时任务提供了一个易于实现的API。在没有部署应用程序的多个实例之前,它很有效。默认情况下,Spring无法处理多个实例上的调度程序同步,而是在每个节点上同时执行作业。

在本篇教程中,我们将了解ShedLock - Java库,它确保我们的计划任务只能同时运行一次,并且可以代替Quartz。

2 Maven依赖

为了使用Spring ShedLock,我们需要添加shedlock-spring依赖项:

代码语言:javascript
复制
<dependency>
    <groupId>net.javacrumbs.shedlock</groupId>
    <artifactId>shedlock-spring</artifactId>
    <version>2.2.0</version>
</dependency>

3 配置

注意,ShedLock仅适用于具有共享数据库的环境。它在数据库中创建一个表或文档,用于存储有关当前锁的信息。

目前,ShedLock支持Mongo,Redis,Hazelcast,ZooKeeper以及任何带有JDBC驱动程序的东西。

如下示例,我们将使用PostgreSQL数据库。为了使它工作,我们需要提供ShedLock的JDBC依赖:

代码语言:javascript
复制
<dependency>
    <groupId>net.javacrumbs.shedlock</groupId>
    <artifactId>shedlock-provider-jdbc-template</artifactId>
    <version>2.1.0</version>
</dependency>

接下来,我们需要为ShedLock创建一个数据库表,以保留有关调度程序锁的信息:

代码语言:javascript
复制
CREATE TABLE shedlock(
  name VARCHAR(64),
  lock_until TIMESTAMP(3) NULL,
  locked_at TIMESTAMP(3) NULL,
  locked_by  VARCHAR(255),
  PRIMARY KEY (name)
)

还需要提供的另一个配置是Spring配置类上的@EnableScheduling和@EnableSchedulerLock注释:

代码语言:javascript
复制
@SpringBootApplication
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")
public class SpringApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringApplication.class, args);
    }
}

defaultLockAtMostFor参数指定在执行节点结束时应保留锁的默认时间量。它使用ISO8601 Duration格式。

在下一节中,我们将了解如何重写此默认值。

4 创建任务

要创建由ShedLock处理的计划任务,我们只需将方法上配置@Scheduled和@SchedulerLock注释:

代码语言:javascript
复制
@Component
class TaskScheduler {

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

首先,让我们来看看@Scheduled。它支持cron格式,这个表达式意味着“每15分钟”。

接下来,看看@SchedulerLock,name参数必须是唯一的,ClassName_methodName通常足以实现它。我们不希望同时有多个相同名称方法运行,所以ShedLock使用唯一名称来实现该目的。

我们还添加了几个可选参数。

首先,我们添加了lockAtLeastForString,以便我们可以在方法调用之间产生时间间隔。使用“PT5M”意味着此方法至少可以锁定5分钟。换句话说,这意味着这种方法可以由ShedLock运行,而不是每五分钟运行一次。

接下来,我们添加了lockAtMostForString来指定在执行节点完成时应该保留多长时间。使用“PT14M”意味着它将被锁定不超过14分钟。

在正常情况下,ShedLock会在任务完成后直接释放锁。但是,实际上,我们没有必要这样做,因为@EnableSchedulerLock中提供了默认值,但我们选择在此处重写它。

5 总结

在本文中,我们学习了如何使用ShedLock创建和同步计划任务。

一如既往,所有源代码都可以在GitHub获得。

https://github.com/eugenp/tutorials/tree/master/spring-all

原文链接:https://www.baeldung.com/shedlock-spring 作者:baeldung 译者:Emma

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿DD 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 来源:SpringForAll社区
    • 1 概述
      • 2 Maven依赖
        • 3 配置
          • 4 创建任务
            • 5 总结
            相关产品与服务
            数据库
            云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档