皮皮网

【家用源码搭建】【object源码分析】【春秋作品源码】quartz源码 集群

2024-12-24 11:20:03 来源:智慧缴费系统源码

1.SpringBoot 整合 Quartz 实现分布式调度
2.quartz表达式介绍 Quartz介绍
3.SpringBoot集成Quartz集群
4.quartz集群线程池的源码优先级作用

quartz源码 集群

SpringBoot 整合 Quartz 实现分布式调度

       本文主要分享内容如下:

       Quartz是Java领域最著名的开源任务调度工具。在上篇文章中,集群我们详细介绍了Quartz在单体应用环境中的源码实践,尽管Spring Scheduled也能够实现任务调度,集群并且与SpringBoot无缝集成,源码支持注解配置,集群家用源码搭建操作极其简便。源码然而,集群它在集群环境下存在一个缺点,源码即可能导致任务重复调度的集群问题。

       相比之下,源码Quartz提供了丰富的集群特性,如任务持久化、源码集群部署以及分布式调度任务,集群因此在系统开发中应用广泛。源码在集群环境下,Quartz集群中的每个节点视为一个独立的Quartz应用,没有专门的object源码分析集中管理节点。它们通过数据库表来感知彼此,利用数据库锁机制实现集群并发控制,确保每个任务当前运行的有效节点仅有一个。

       特别需要注意的是,分布式部署时需保证各个节点的系统时间一致。接下来,我们通过具体应用实践来深入理解Quartz集群架构。

       为了进行Quartz集群实践,我们需要先对数据表进行初始化。访问Quartz官网,下载对应的版本,如quartz-2.3.0-distribution.tar.gz,并解压。在文件中搜索SQL脚本,选择适合当前环境的数据库脚本文件,如mysql-5.7环境下的tables_mysql_innodb.sql脚本,完成数据库表的春秋作品源码初始化。

       数据库表结构如下:

       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服务层接口。office tab 源码

       编写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调度线程和任务执行线程,其中任务执行线程通常使用一个线程池维护一组线程。