Java中Quartz高可用定时任务快速入门


Posted in Java/Android onApril 03, 2022

定时任务使用指南

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

定时任务模块是对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脚本,注意初始化数据库

到此这篇关于Java中Quartz高可用定时任务快速入门的文章就介绍到这了,更多相关Java Quartz定时任务内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木! 

Java/Android 相关文章推荐
详解SpringBoot异常处理流程及原理
Jun 21 Java/Android
Java循环队列与非循环队列的区别总结
Jun 22 Java/Android
Feign调用传输文件异常的解决
Jun 24 Java/Android
Java中常用解析工具jackson及fastjson的使用
Jun 28 Java/Android
JavaGUI模仿QQ聊天功能完整版
Jul 04 Java/Android
使用HttpSessionListener监听器实战
Mar 17 Java/Android
Spring Data JPA框架Repository自定义实现
Apr 28 Java/Android
Spring Boot项目如何优雅实现Excel导入与导出功能
Jun 10 Java/Android
Android开发手册TextInputLayout样式使用示例
Jun 10 Java/Android
springboot为异步任务规划自定义线程池的实现
Jun 14 Java/Android
Spring Security动态权限的实现方法详解
Jun 16 Java/Android
spring 项目实现限流方法示例
Jul 15 Java/Android
Spring Security使用单点登录的权限功能
Spring Boot 底层原理基础深度解析
Java 超详细讲解数据结构中的堆的应用
Java 数据结构七大排序使用分析
Java基础——Map集合
Apr 01 #Java/Android
Android基于Fresco实现圆角和圆形图片
Apr 01 #Java/Android
Android自定义scrollview实现回弹效果
Apr 01 #Java/Android
You might like
总集篇&特番节目先行播出!《SAO Alicization War of Underworld》第2季度TV动画4月25日放送!
2020/03/06 日漫
PHP读取文件内容的五种方式
2015/12/28 PHP
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
IE6 hack for js 集锦
2014/09/23 Javascript
JavaScript实现斗地主游戏的思路
2016/02/29 Javascript
JS中frameset框架弹出层实例代码
2016/04/01 Javascript
ES6新特性之Symbol类型用法分析
2017/03/31 Javascript
原生js实现简单的链式操作
2017/07/04 Javascript
JS中获取 DOM 元素的绝对位置实例详解
2018/04/23 Javascript
微信小程序实现发红包功能
2018/07/11 Javascript
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
2019/05/09 Javascript
JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】
2020/02/24 Javascript
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
2020/04/07 Javascript
[54:47]Liquid vs VP Supermajor决赛 BO 第五场 6.10
2018/07/05 DOTA
简介二分查找算法与相关的Python实现示例
2015/08/26 Python
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
2017/07/06 Python
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
Python调用C语言的方法【基于ctypes模块】
2018/01/22 Python
Python import与from import使用及区别介绍
2018/09/06 Python
Python解析多帧dicom数据详解
2020/01/13 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
2020/03/06 Python
PyQt5通过信号实现MVC的示例
2021/02/06 Python
Keras保存模型并载入模型继续训练的实现
2021/02/20 Python
详解CSS3弹性伸缩盒
2020/09/21 HTML / CSS
Bobbi Brown芭比波朗美国官网:化妆师专业彩妆保养品品牌
2016/08/18 全球购物
美国校服网上商店:French Toast
2019/10/08 全球购物
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
出国留学自荐信
2013/10/25 职场文书
婚前协议书
2014/04/15 职场文书
大学生个人简历自我评价
2015/03/11 职场文书
民事撤诉申请书范本
2015/05/18 职场文书
2015年乡镇财政工作总结
2015/05/19 职场文书
2015年入党积极分子培养考察意见
2015/08/12 职场文书
Redis安装使用RedisJSON模块的方法
2022/03/23 Redis
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL