乐趣区

关于quartz:Quartz高可用定时任务快速上手

定时工作使用指南

如果你想做定时工作,有 高可用 方面的需要,或者仅仅想 入门快,上手简略,那么选用它准没错。

定时工作模块是对 Quartz 框架进一步封装,应用更加简洁。

1、引入依赖
<dependency>
    <groupId>xin.altitude.cms</groupId>
    <artifactId>ucode-cms-quartz</artifactId>
    <version>1.5.4.1</version>
</dependency>
2、疾速上手

实现 org.quartz.Job 接口;应用注解 CronExp 增加工作的调度策略;应用注解 Component 将工作注入容器中。

启动我的项目,定时工作便处于监听与运行中。

@Component
@DisallowConcurrentExecution
@CronExp(cron = "0/5 * * * * ?")
public class DemoJob implements Job {
    @Override
    public void execute(JobExecutionContext context) {System.out.println("工作 1:" + LocalDateTime.now());
    }
}

3、手动触发定时工作

定时工作除了以既有频率周期性运行外,还有通过接口手动被触发的能力。

调用如下接口,可手动触发工作 ID 编号为 jobId 的工作。

http://localhost:8080/cms-api/quartz/job/{jobId}

如果有手动触发定时工作的需要,则须要工作 ID惟一并 已知,因而须要在编写定时工作时手动指定。

@CronExp(id = 1, cron = "0/5 * * * * ?")

通过注解 CronExp 的 id 属性可指定工作 ID,不显示指定则应用随机 ID,不满足已知的条件,因而无奈手动触发。

4、带参数工作

只管大多数工作不须要注入参数,但仍有大量的场景须要向定时工作注入参数。

public void execute(JobExecutionContext context) {
    /* 如果在调用工作时传入了参数,则可能从 Map 中获取 */
    Map<String, Object> dataMap = context.getMergedJobDataMap();
    /* 比方从 Map 中获取一个键值对,一般来说参数均为根本数据类型 */
    Object key = dataMap.get("key");
    System.out.println("工作 2:" + LocalDateTime.now() + ":" + key);
}

在编写定时工作时,可从 JobExecutionContext 对象中解析一个 Map,从而实现参数的注入。

http://localhost:8080/cms-api/quartz/job/1?key=a

上述 http 调用的含意是手动触发工作 ID 为【1】的工作,并且向其传递参数为【key】值为【a】的参数。

5、工作并发

本框架不反对工作并发,换句话说并发对定时工作不利,因而须要手动禁止。

须要留神的是 Quartz 的并发是指当工作执行耗时超过任务调度周期时,上一个工作未执行完,新工作是否执行。

一般来说须要显示禁止并发,在工作类上增加注解 DisallowConcurrentExecution 即可禁止工作并发。

6、长久化

如果定时工作有高可用的需要,那么须要对工作进行长久化。定时工作数据长久化到数据库中后,反对应用程序多开。定时工作长久化多节点部署后,集群中单节点故障不影响定时工作的执行。

定时工作长久化,仅需批改 yml 文件配置即可达到目标,无需批改代码。一般而言应用 Mysql 做长久化的容器。

spring:
  quartz:
    properties:
      org.quartz.jobStore.isClustered: true
      org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX
      org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
      org.quartz.jobStore.dataSource: qzDS
      org.quartz.dataSource.qzDS.driver: com.mysql.cj.jdbc.Driver
      org.quartz.dataSource.qzDS.URL: jdbc:mysql://localhost:3306/quartz-demo
      org.quartz.dataSource.qzDS.user: root
      org.quartz.dataSource.qzDS.password: 123456

除了批改主机、端口、数据库名、用户名、明码五个参数外,其余参数应用默认值即可。

配置完数据库连贯后,应用 SQL 脚本,留神初始化数据库


如有疑难,可通过微信 dream4s 与作者分割。源码在 GitHub,视频解说在 B 站,本文珍藏在博客天地。


退出移动版