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将文件打包成zip存放或导出
Jun 11 Java/Android
分析Netty直接内存原理及应用
Jun 14 Java/Android
SpringBoot项目中控制台日志的保存配置操作
Jun 18 Java/Android
Java新手教程之ArrayList的基本使用
Jun 20 Java/Android
IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署
Sep 25 Java/Android
Java8中接口的新特性使用指南
Nov 01 Java/Android
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
Dec 06 Java/Android
你知道Java Spring的两种事务吗
Mar 16 Java/Android
Spring this调用当前类方法无法拦截的示例代码
Mar 20 Java/Android
SpringBoot2零基础到精通之数据库专项精讲
Mar 22 Java/Android
springboot入门 之profile设置方式
Apr 04 Java/Android
Java数据结构之堆(优先队列)
May 20 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
PHP面向对象编程快速入门
2006/10/09 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
PHP通过文件路径获取文件名的实例代码
2018/10/14 PHP
Aster vs Newbee BO5 第三场2.19
2021/03/10 DOTA
javascript权威指南 学习笔记之null和undefined
2011/09/25 Javascript
firefox下jQuery UI Autocomplete 1.8.*中文输入修正方法
2012/09/19 Javascript
在myeclipse中如何加入jquery代码提示功能
2014/06/03 Javascript
jquery使用slideDown实现模块缓慢拉出效果的方法
2015/03/27 Javascript
基于jquery插件实现拖拽删除图片功能
2020/08/27 Javascript
JQuery解析XML数据的几个简单实例
2016/05/18 Javascript
利用vue.js插入dom节点的方法
2017/03/15 Javascript
原生JS改变透明度实现轮播效果
2017/03/24 Javascript
js变量声明var使用与不使用的区别详解
2019/01/21 Javascript
微信小程序实现的picker多级联动功能示例
2019/05/23 Javascript
JQuery样式与属性设置方法分析
2019/12/07 jQuery
详解node和ES6的模块导出与导入
2020/02/19 Javascript
用云开发Cloudbase实现小程序多图片内容安全监测的代码详解
2020/06/07 Javascript
如何使用 vue-cli 创建模板项目
2020/11/19 Vue.js
JavaScript字符串转数字的简单实现方法
2020/11/27 Javascript
Python3实现生成随机密码的方法
2014/08/23 Python
使用pandas读取csv文件的指定列方法
2018/04/21 Python
使用python进行波形及频谱绘制的方法
2019/06/17 Python
python实现信号时域统计特征提取代码
2020/02/26 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
2020/02/26 Python
使用Python三角函数公式计算三角形的夹角案例
2020/04/15 Python
windows下的pycharm安装及其设置中文菜单
2020/04/23 Python
New Era英国官网:美国棒球帽品牌
2018/03/21 全球购物
利用异或运算实现两个无符号数的加法运算
2013/12/20 面试题
艺术设计专业个人求职信
2014/04/10 职场文书
竞选部长演讲稿
2014/04/26 职场文书
毕业生找工作求职信
2014/08/05 职场文书
门面房租房协议书
2014/12/01 职场文书
国际贸易实训总结
2015/08/03 职场文书
2015年度工程师评职称工作总结
2015/10/14 职场文书
请假条应该怎么写?
2019/06/24 职场文书
SQLServer2008提示评估期已过解决方案
2021/04/12 SQL Server