定时工作使用指南
如果你想做定时工作,有 高可用
方面的需要,或者仅仅想 入门快
,上手简略,那么选用它准没错。
定时工作模块是对 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 站,本文珍藏在博客天地。