如何使用Quartz实现Java高可用定时任务?
定时任务使用指南
如果你想做定时任务,有高可用
方面的需求,或者仅仅想入门快
,上手简单,那么选用它准没错。
定时任务模块是对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脚本,注意初始化数据库
以上是如何使用Quartz实现Java高可用定时任务?的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Java 8引入了Stream API,提供了一种强大且表达力丰富的处理数据集合的方式。然而,使用Stream时,一个常见问题是:如何从forEach操作中中断或返回? 传统循环允许提前中断或返回,但Stream的forEach方法并不直接支持这种方式。本文将解释原因,并探讨在Stream处理系统中实现提前终止的替代方法。 延伸阅读: Java Stream API改进 理解Stream forEach forEach方法是一个终端操作,它对Stream中的每个元素执行一个操作。它的设计意图是处

胶囊是一种三维几何图形,由一个圆柱体和两端各一个半球体组成。胶囊的体积可以通过将圆柱体的体积和两端半球体的体积相加来计算。本教程将讨论如何使用不同的方法在Java中计算给定胶囊的体积。 胶囊体积公式 胶囊体积的公式如下: 胶囊体积 = 圆柱体体积 两个半球体体积 其中, r: 半球体的半径。 h: 圆柱体的高度(不包括半球体)。 例子 1 输入 半径 = 5 单位 高度 = 10 单位 输出 体积 = 1570.8 立方单位 解释 使用公式计算体积: 体积 = π × r2 × h (4

Java是热门编程语言,适合初学者和经验丰富的开发者学习。本教程从基础概念出发,逐步深入讲解高级主题。安装Java开发工具包后,可通过创建简单的“Hello,World!”程序实践编程。理解代码后,使用命令提示符编译并运行程序,控制台上将输出“Hello,World!”。学习Java开启了编程之旅,随着掌握程度加深,可创建更复杂的应用程序。
