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 ES多节点任务的高效分发与收集实现
Jun 30 Java/Android
一篇文章带你学习Mybatis-Plus(新手入门)
Aug 02 Java/Android
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
Mar 21 Java/Android
springboot+zookeeper实现分布式锁
Mar 21 Java/Android
Netty分布式客户端接入流程初始化源码分析
Mar 25 Java/Android
Android Rxjava3 使用场景详解
Apr 07 Java/Android
JAVA长虹键法之建造者Builder模式实现
Apr 10 Java/Android
Spring Data JPA框架自定义Repository接口
Apr 28 Java/Android
Jmerte 分布式压测及分布式压测配置
Apr 30 Java/Android
Java 数组的使用
May 11 Java/Android
SpringCloud超详细讲解Feign声明式服务调用
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
php的array_multisort()使用方法介绍
2012/05/16 PHP
php实现的一个简单json rpc框架实例
2015/03/30 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
2016/03/16 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
2016/11/05 PHP
laravel 解决ajax异步提交数据,并还回填充表格的问题
2019/10/15 PHP
jquery tablesorter.js 支持中文表格排序改进
2009/12/09 Javascript
JavaScript Eval 函数使用
2010/03/23 Javascript
jquery 学习笔记一
2010/04/07 Javascript
JavaScript定义类或函数的几种方式小结
2011/01/09 Javascript
JS中window.open全屏命令解析及使用示例
2013/12/11 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
JavaScript中对循环语句的优化技巧深入探讨
2014/06/06 Javascript
浅析node.js中close事件
2014/11/26 Javascript
JS封装的选项卡TAB切换效果示例
2016/09/20 Javascript
浅谈js中用$(#ID)来作为选择器的问题(id重复的时候)
2017/02/14 Javascript
jquery仿微信聊天界面
2017/05/06 jQuery
详解angularjs 关于ui-router分层使用
2017/06/12 Javascript
解决nodejs的npm命令无反应的问题
2018/05/17 NodeJs
js验证账户名是否重复
2020/05/26 Javascript
[55:54]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python中%是什么意思?python中百分号如何使用?
2018/03/20 Python
python 从csv读数据到mysql的实例
2018/06/21 Python
在Pycharm中对代码进行注释和缩进的方法详解
2019/01/20 Python
解决python运行效率不高的问题
2020/07/20 Python
Python headers请求头如何实现快速添加
2020/11/03 Python
基于Html5实现的语音搜索功能
2019/05/13 HTML / CSS
Java工程师面试集锦之Spring框架
2013/06/16 面试题
数据员岗位职责
2013/11/19 职场文书
婚纱摄影师求职信
2014/03/07 职场文书
司仪主持词两篇
2014/03/22 职场文书
党员干部承诺书范文
2014/03/25 职场文书
《有余数的除法》教学反思
2016/02/22 职场文书
使用 JavaScript 制作页面效果
2021/04/21 Javascript
python可视化之颜色映射详解
2021/09/15 Python
Android 界面一键变灰 深色主题工具类
2022/04/28 Java/Android
MySQL如何修改字段类型和字段长度
2022/06/10 MySQL