Spring ShedLock指南
来源:SpringForAll社区
1 概述
Spring为定时任务提供了一个易于实现的API。在没有部署应用程序的多个实例之前,它很有效。默认情况下,Spring无法处理多个实例上的调度程序同步,而是在每个节点上同时执行作业。
在本篇教程中,我们将了解ShedLock - Java库,它确保我们的计划任务只能同时运行一次,并且可以代替Quartz。
2 Maven依赖
为了使用Spring ShedLock,我们需要添加shedlock-spring依赖项:
<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依赖:
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-jdbc-template</artifactId>
<version>2.1.0</version>
</dependency>
接下来,我们需要为ShedLock创建一个数据库表,以保留有关调度程序锁的信息:
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注释:
@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注释:
@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
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- HDU 6342
- Android Handler机制12之Callable、Future和FutureTask
- 图的割点 --《啊哈!算法》
- Android Handler机制13之AsyncTask源码解析
- Android插件化基础3----Android的编译打包流程详解
- APK安装流程详解2——PackageManager简介
- Educational Codeforces Round 44 (Rated for Div. 2) B. Switches and Lamps
- APK安装流程详解3——PackageManager与PackageManagerService
- APK安装流程详解4——安装中关于so库的那些事
- Educational Codeforces Round 44 (Rated for Div. 2)A. Chess Placing
- APK安装流程详解5——Installer、InstallerConnection和Installd守护进程
- APK安装流程详解6——PackageManagerService启动前奏
- opencv imwrite函数参数详解+例子
- APK安装流程详解7——PackageManagerService的启动流程(上)
- 南昌大学航天杯第二届程序设计竞赛校赛网络同步赛 水题