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 相关文章推荐
Spring Bean的实例化之属性注入源码剖析过程
Jun 13 Java/Android
解析Java异步之call future
Jun 14 Java/Android
springboot拦截器无法注入redisTemplate的解决方法
Jun 27 Java/Android
Springboot集成阿里云OSS上传文件系统教程
Jun 28 Java/Android
SpringBoot集成Druid连接池连接MySQL8.0.11
Jul 02 Java/Android
JavaWeb 入门:Hello Servlet
Jul 16 Java/Android
gateway与spring-boot-starter-web冲突问题的解决
Jul 16 Java/Android
Spring Boot mybatis-config 和 log4j 输出sql 日志的方式
Jul 26 Java/Android
Java中CyclicBarrier和CountDownLatch的用法与区别
Aug 23 Java/Android
Spring Security使用单点登录的权限功能
Apr 03 Java/Android
Dubbo+zookeeper搭配分布式服务的过程详解
Apr 03 Java/Android
Java死锁的排查
May 11 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
德生S2000南麂列岛台湾FM收听记录
2021/03/02 无线电
简单采集了yahoo的一些数据
2007/02/14 PHP
php之对抗Web扫描器的脚本技巧
2008/10/01 PHP
PHP,ASP.JAVA,JAVA代码格式化工具整理
2010/06/15 PHP
php object转数组示例
2014/01/15 PHP
解密ThinkPHP3.1.2版本之模板继承
2014/06/19 PHP
PHP基于MySQLI函数封装的数据库连接工具类【定义与用法】
2017/08/11 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
PHP获取当前时间不准确问题解决方案
2020/08/14 PHP
javaScript - 如何引入js代码
2021/03/09 Javascript
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
jQuery写的日历(包括日历的样式及功能)
2013/04/23 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
2014/02/07 Javascript
jQuery 文本框得失焦点的简单实例
2014/02/19 Javascript
js实现双击图片放大单击缩小的方法
2015/02/17 Javascript
Jquery幻灯片特效代码分享--鼠标点击按钮时切换(1)
2015/08/15 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
2016/08/29 Javascript
JS实现获取来自百度,Google,soso,sogou关键词的方法
2016/12/21 Javascript
node实现简单的反向代理服务器
2017/07/26 Javascript
jQuery实现对网页节点的增删改查功能示例
2017/09/18 jQuery
Vue中this.$router.push参数获取方法
2018/02/27 Javascript
vue3.0 CLI - 3.2 路由的初级使用教程
2018/09/20 Javascript
layui使用表格渲染获取行数据的例子
2019/09/13 Javascript
vue单应用在ios系统中实现微信分享功能操作
2020/09/07 Javascript
Vue axios 跨域请求无法带上cookie的解决
2020/09/08 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
2021/01/29 Vue.js
在Python的Django框架中显示对象子集的方法
2015/07/21 Python
使用python实现mqtt的发布和订阅
2019/05/05 Python
Python使用ElementTree美化XML格式的操作
2020/03/06 Python
Python可以实现栈的结构吗
2020/05/27 Python
Python绘图之柱形图绘制详解
2020/07/28 Python
党的群众路线教育实践活动整改落实情况自查报告
2014/10/28 职场文书
教学督导岗位职责
2015/04/10 职场文书
《青山不老》教学反思
2016/02/22 职场文书