SpringBoot 整合 Quartz 实现分布式调度
本文主要分享内容如下: Quartz是Java领域最著名的开源任务调度工具。在上篇文章中,集群我们详细介绍了Quartz在单体应用环境中的源码实践,尽管Spring Scheduled也能够实现任务调度,集群并且与SpringBoot无缝集成,源码支持注解配置,集群美团网 源码操作极其简便。源码然而,集群它在集群环境下存在一个缺点,源码即可能导致任务重复调度的集群问题。 相比之下,源码Quartz提供了丰富的集群特性,如任务持久化、源码集群部署以及分布式调度任务,集群因此在系统开发中应用广泛。源码在集群环境下,Quartz集群中的每个节点视为一个独立的Quartz应用,没有专门的搜狗引擎源码集中管理节点。它们通过数据库表来感知彼此,利用数据库锁机制实现集群并发控制,确保每个任务当前运行的有效节点仅有一个。 特别需要注意的是,分布式部署时需保证各个节点的系统时间一致。接下来,我们通过具体应用实践来深入理解Quartz集群架构。 为了进行Quartz集群实践,我们需要先对数据表进行初始化。访问Quartz官网,下载对应的版本,如quartz-2.3.0-distribution.tar.gz,并解压。在文件中搜索SQL脚本,选择适合当前环境的数据库脚本文件,如mysql-5.7环境下的tables_mysql_innodb.sql脚本,完成数据库表的crm 事务 源码初始化。 数据库表结构如下: QRTZ_BLOG_TRIGGERS:Trigger作为Blob类型存储 QRTZ_CALENDARS:存储Quartz的Calendar信息 QRTZ_CRON_TRIGGERS:存储CronTrigger,包括Cron表达式和时区信息 QRTZ_FIRED_TRIGGERS:存储已触发的Trigger相关的状态信息及关联Job的执行信息 QRTZ_JOB_DETAILS:存储已配置的Job的详细信息 QRTZ_LOCKS:存储程序的悲观锁信息 QRTZ_PAUSED_TRIGGER_GRPS:存储已暂停的Trigger组信息 QRTZ_SCHEDULER_STATE:存储有关Scheduler状态的少量信息,与其他Scheduler实例 QRTZ_SIMPLE_TRIGGERS:存储简单的Trigger,包括重复次数、间隔、以及已触发的次数 QRTZ_SIMPROP_TRIGGERS:存储CalendarIntervalTrigger和DailyTimeIntervalTrigger两种类型的触发器 QRTZ_TRIGGERS:存储已配置的Trigger信息 其中,QRTZ_LOCKS是实现Quartz集群同步机制的行锁表。 实现Quartz集群实践的具体步骤如下: 创建SpringBoot项目,导入maven依赖包。 创建application.properties配置文件。 创建quartz.properties配置文件。 注册Quartz任务工厂。 注册调度工厂。 重新设置Quartz数据连接池,推荐使用Driud数据连接池。 编写Job具体任务类。 编写Quartz服务层接口。拐点预测源码 编写Controller服务。 服务接口测试。 注册监听器(可选)。 采用项目数据源(可选)。 在实际部署中,项目通常会集群部署。为了确保与正式环境一致,我们可以通过新建多个相同的项目来测试Quartz在集群环境下的分布式调度功能。理论上,只需将新建的项目重新复制并修改端口号即可实现本地测试。 在测试集群环境下Quartz的分布式调度时,我们通常只需保持QuartzConfig、DruidConnectionProvider、QuartzJobFactory、TfCommandJob、quartz.properties类和配置相同。首先启动的页面查看源码服务(如quartz-)会优先加载数据库中配置的定时任务,而其他服务(如quartz-、quartz-)在没有主动调度的情况下,不会运行任务。 最终结果验证了预期效果:任何一个定时任务只有一台机器在运行,确保了分布式调度的正确性。 本文围绕SpringBoot + Quartz + MySQL实现持久化分布式调度进行了介绍。所有代码功能均由作者亲自测试验证,尽管内容较为详尽,但考虑到作者学识有限,如有遗漏或错误之处,欢迎读者批评指正。如有需要获取项目源代码,可通过相应方式获取。 参考资源:美团 - Quartz应用与集群原理分析
掘金 - 分布式定时任务框架Quartz
quartz表达式介绍 Quartz介绍
1、quartz表达式介绍
Cron表达式的时间字段除允许设置数值外,还可使用一些特殊的字符,提供列表、范围、通配符等功能,细说如下:
(1)星号(*):可用在所有字段中,表示对应时间域的每一个时刻,例如,*在分钟字段时,表示“每分钟”;
(2)问号(?):该字符只在日期和星期字段中使用,它通常指定为“无意义的值”,相当于点位符;
(3)减号(-):表达一个范围,如在小时字段中使用“-”,则表示从到点,即,,;
(4)逗号(,):表达一个列表值,如在星期字段中使用“MON,WED,FRI”,则表示星期一,星期三和星期五;
(5)斜杠(/):x/y表达一个等步长序列,x为起始值,y为增量步长值。如在分钟字段中使用0/,则表示为0,,和秒,而5/在分钟字段中表示5,,,,你也可以使用*/y,它等同于0/y;
2、Quartz.NET是一个开源的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,它用C#写成,可用于winform和asp.net应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等,比如:表示式: 0 0 * * ? 表示:每天的点调用。
3、Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。Quartz的最新版本为Quartz 2.3.2。
SpringBoot集成Quartz集群
在SpringBoot项目中,为了应对高并发和生产环境的高负载需求,经常需要集成Quartz进行定时任务处理。当任务数量众多时,单节点可能无法满足,因此需要搭建Quartz集群。集群的首要考虑是数据持久化策略。
Quartz支持内存(RAMJobStore)和数据库存储两种任务存储方式。内存存储快速但不持久,一旦服务器宕机,任务信息丢失;而数据库存储(如Mysql)则保证任务在重启后能继续执行,但需配置相关的数据库连接信息。
以Mysql为例,搭建集群步骤包括:首先,从Quartz包中解压并运行针对Mysql的sql脚本,创建张用于存储任务信息的表。集群节点之间通过定时任务的持久化和加锁机制协同工作。
实现一个简单的任务调度系统,需要在Maven项目中添加相关依赖,配置application.properties,定义任务实体类,创建Job任务类,编写操作服务类和接口控制器。Gitee上提供了示例代码。
在搭建过程中,可能会遇到一些问题。例如,NoClassDefFoundError可能是因为缺少spring-boot-starter-jdbc的依赖;而SchedulerConfigException的'DataSource name not set'错误则需将JobStore类型由JobStoreTX改为LocalDataSourceJobStore。
quartz集群线程池的优先级作用
进行作业的执行。
Trigger的优先级:Quartz管理着一个线程池,用来进行作业的执行,当可用线程数目少于目前待调度的作业数目时,哪个作业的Trigger优先级高,该作业就会优先分配work thread执行。
在Quartz中,有两类线程,Scheduler调度线程和任务执行线程,其中任务执行线程通常使用一个线程池维护一组线程。
2024-12-23 23:53
2024-12-23 23:03
2024-12-23 22:59
2024-12-23 22:35
2024-12-23 22:26