Spring4集成Quartz2.2.3定时任务集群配置

本文详细介绍Quartz在集群环境下的配置与Spring框架的集成方法。Quartz是一个强大的任务调度器,可在J2EE应用程序中独立运行。文章涵盖Quartz集群原理、数据库表创建、配置文件设置及Spring集成步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Quartz与Spring集成及集群环境配置

  • Quartz介绍

Quartz是一个开源项目,专注于任务调度器,它可以与J2EE应用程序相结合也可以单独使用。简单的使用方法创建一个实现org.quartz.Job接口的java类,实现Job接口包含的唯一方法:execute()。将定时任务逻辑添加到execute()方法中。

当在集群环境下,当有配置Quartz多个客户端(节点)时,采用Quartz的集群和分布式处理时,有如下几点好处 :

1.一个节点无法完成的任务,会被集群中拥有相同的任务的节点取代执行。

2.分布式体现在当相同的任务定时在一个时间点,在那个时间点,不会被两个节点同时执行。

  • Quartz集群原理
  1. Quartz集群架构

一个Quartz集群中的每个节点是一个独立的Quartz应用,它又管理着其他的节点。这就意味着你必须对每个节点分别启动或停止。Quartz集群中,独立的Quartz节点并不与另一其的节点或是管理节点通信,而是通过相同的数据库表来感知到另一Quartz应用的,调度任务存储在数据库中,当集群任务操作数据库,数据库就会被加锁,防止其他相同的任务也读取到该任务,避免任务的重复执行。如图:

  1. Quartz集群相关数据库表

因为Quartz集群依赖于数据库,所以必须首先创建Quartz数据库表,Quartz发布包中包括了所有被支持的数据库平台的SQL脚本。这些SQL脚本存放于<quartz_home>/docs/dbTables 目录下,Quartz版本2.2.3,其中包含了11张表。

  • Spring集成Quartz

完成初次集成,后续添加定时任务只需按照第5步方式添加即可。

  1. 添加Quartz依赖jar包

<dependency>

    <groupId>org.quartz-scheduler</groupId>

    <artifactId>quartz</artifactId>

    <version>2.2.3</version>

</dependency>

<dependency>

    <groupId>org.quartz-scheduler</groupId>

    <artifactId>quartz-jobs</artifactId>

    <version>2.2.3</version>

</dependency>  

  1. 创建数据库表结构

根据Quartz下载包提供的标准SQL,选择对应的数据库类型,进行数据库表结构创建。如下,框内为与集群定时任务紧密相关联表。

 

  1. 创建Quartz配置文件quartz.properties

 

org.quartz.scheduler.instanceName属性可为任何值,用在 JDBC JobStore 中来唯一标识实例,但是所有集群节点中必须相同。

org.quartz.jobStore.class属性为 JobStoreTX,将任务持久化到数据中。因为集群中节点依赖于数据库来传播 Scheduler 实例的状态,你只能在使用 JDBC JobStore 时应用 Quartz 集群。这意味着你必须使用 JobStoreTX 或是 JobStoreCMT 作为 Job 存储;你不能在集群中使用 RAMJobStore。

org.quartz.jobStore.isClustered 属性为 true,你就告诉了 Scheduler 实例要它参与到一个集群当中。这一属性会贯穿于调度框架的始终,用于修改集群环境中操作的默认行为。

org.quartz.jobStore.clusterCheckinInterval 属性定义了Scheduler 实例检入到数据库中的频率(单位:毫秒)。Scheduler 检查是否其他的实例到了它们应当检入的时候未检入;这能指出一个失败的 Scheduler 实例,且当前 Scheduler 会以此来接管任何执行失败并可恢复的 Job。通过检入操作,Scheduler 也会更新自身的状态记录。clusterChedkinInterval 越小,Scheduler 节点检查失败的 Scheduler 实例就越频繁。默认值是 15000 (即15 秒)。

  1. 配置applicationContext-quartz.xml文件

本文件主要是配置触发器的属性和定时任务的路径和执行规则。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="http://www.springframework.org/schema/beans                      http://www.springframework.org/schema/beans/spring-beans.xsd">

       <bean name="quartzScheduler"

      class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

              <property name="dataSource">

                     <ref bean="dataSource" />

              </property>

              <property name="overwriteExistingJobs" value="true" />

              <property name="startupDelay" value="2" />    

              <property name="applicationContextSchedulerContextKey" value="applicationContextKey" />

              <property name="configLocation" value="classpath:quartz.properties" />

              <property name="triggers">

                     <list>

                            <ref bean="trigger1" />

                     </list>

              </property>

       </bean>

       <bean id="jobDetail1"

      class="org.springframework.scheduling.quartz.JobDetailFactoryBean">

              <property name="jobClass">

                     <value>com.genersoft.pub.quartz.MyJob</value>

              </property>

              <property name="durability" value="true" />

              <property name="requestsRecovery" value="true" />

       </bean>

       <bean id="trigger1"

      class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">

              <property name="jobDetail" ref="jobDetail1" />

              <property name="cronExpression" value="0 43,44,45 11 * * ?" />

       </bean>

</beans>

 

dataSource:项目中用到的数据源,里面包含了quartz用到的11张数据库表。

configLocation:用于指明quartz的配置文件的位置。

requestsRecovery属性必须设置为 true,当Quartz服务被中止后,再次启动或集群中其他机器接手任务时会尝试恢复执行之前未完成的所有任务。

overwriteExistingJobs属性设置为true,当QuartzScheduler 启动时更新己存在的Job。

startupDelay属性控制QuartzScheduler 延时启动,应用启动完成后QuartzScheduler 再启动。

  1. 如何添加一个或多个定时任务

在applicationContext-quartz.xml文件中配置多个触发器实现多个定时任务的配置。每个触发器对应一个任务消息描述。如下:

注意事项:

当使用quartz集群模式时,当集群中的代码版本不一致,会出现qrtz_triggers中trigger_state的状态变为error的情况,原因是集群模式先quartz执行调度任务,是根据数据库表中的调度记录进行执行,当执行到有对应代码的节点上,不会出现问题,但是当执行到没有对应代码的节点上,就会变为error, 
因此在集群环境下,节点较多的时候使用quartz,需要注意每个节点的代码版本一定要保持一致。

  1. 执行规则生成介绍(cron表达式)

本文中Quartz定时任务采用cron表达式来定制执行规则。Cron表达式可在线生成。如图所示:

在线生成网址:

http://cron.qqe2.com/

  • 参考文档
  1. https://blog.youkuaiyun.com/zhen340417593/article/details/53436819
  2. https://www.cnblogs.com/fanshuyao/p/7484843.html
  3. https://blog.youkuaiyun.com/wtopps/article/details/77753163
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值