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 相关文章推荐
JVM入门之类加载与字节码技术(类加载与类的加载器)
Jun 15 Java/Android
深入理解java.lang.String类的不可变性
Jun 27 Java/Android
Java基础之线程锁相关知识总结
Jun 30 Java/Android
Java 泛型详解(超详细的java泛型方法解析)
Jul 02 Java/Android
JVM的类加载器和双亲委派模式你了解吗
Mar 13 Java/Android
Java 超详细讲解IO操作字节流与字符流
Mar 25 Java/Android
Java实现经典游戏泡泡堂的示例代码
Apr 04 Java/Android
SpringCloud项目如何解决log4j2漏洞
Apr 10 Java/Android
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
Apr 13 Java/Android
springboot为异步任务规划自定义线程池的实现
Jun 14 Java/Android
springboot读取resources下文件的方式详解
Jun 21 Java/Android
Java服务调用RestTemplate与HttpClient的使用详解
Jun 21 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
使用 php4 加速 web 传输
2006/10/09 PHP
php生成扇形比例图实例
2013/11/06 PHP
PHP连接操作access数据库实例
2015/03/30 PHP
php实现的日历程序
2015/06/18 PHP
php使用MySQL保存session会话的方法
2015/06/26 PHP
PHP正则表达式匹配替换与分割功能实例浅析
2017/02/04 PHP
javascript 解析后的xml对象的读取方法细解
2009/07/25 Javascript
JS构建页面的DOM节点结构的实现代码
2011/12/09 Javascript
struts2+jquery+json实现异步加载数据(自写)
2013/06/24 Javascript
JS组件系列之Bootstrap table表格组件神器【终结篇】
2016/05/10 Javascript
AngularJs表单验证实例详解
2016/05/30 Javascript
Angular2中Bootstrap界面库ng-bootstrap详解
2016/10/18 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
详解bootstrap的modal-remote两种加载方式【强化】
2017/01/27 Javascript
详解nodejs微信jssdk后端接口
2017/05/25 NodeJs
laravel5.3 vue 实现收藏夹功能实例详解
2018/01/21 Javascript
Vue 中文本内容超出规定行数后展开收起的处理的实现方法
2019/04/28 Javascript
[51:17]Mski vs VGJ.S Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
Python中规范定义命名空间的一些建议
2016/06/04 Python
python基于itchat实现微信群消息同步机器人
2017/02/27 Python
Python MySQLdb 使用utf-8 编码插入中文数据问题
2018/03/13 Python
用python实现将数组元素按从小到大的顺序排列方法
2018/07/02 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
2019/02/13 Python
python使用 __init__初始化操作简单示例
2019/09/26 Python
html5使用canvas绘制文字特效
2014/12/15 HTML / CSS
Tory Burch美国官方网站:美国时尚生活品牌
2016/08/01 全球购物
挪威户外活动服装和装备购物网站:Bergfreunde挪威
2016/10/20 全球购物
接口的多继承会带来哪些问题
2015/08/17 面试题
学生党员思想汇报
2013/12/28 职场文书
男方父母证婚词
2014/01/12 职场文书
煤矿安全协议书
2014/08/20 职场文书
大二学生学年自我鉴定
2014/09/12 职场文书
元旦标语大全
2014/10/09 职场文书
聚会通知怎么写
2015/04/23 职场文书
乒乓球比赛通知
2015/04/27 职场文书
Django对接elasticsearch实现全文检索的示例代码
2021/08/02 Python