quartz开始就是支持集群的,开始的时候懒得看文档,自己写了个方案到数据库做管理,但对开发人员要求较高,常常出问题
重新看了下,不是很复杂。
使用的quartz版本是1.8.4,spring版本是3.0.3
开始使用的是quartz2.1.7,后来集成spring的时候,总是不成功,查了资料才知道spring需要3.2才能集成quartz2,在升级spring和降低quartz的选择下,选择了降低quartz。
下面开始:
1.编写需要定时执行的代码QuartzTest.java
package cn.zan.util; import java.io.Serializable; import java.util.Date; public class QuartzTest implements Serializable{ /** * 此处必须实现序列号,不然无法集群 */ private static final long serialVersionUID = -2073310586499744415L; public void execute(){ //System.out.println("quartz test execute,every 10 seconds"); Date date=new Date(); System.out.println(date.toLocaleString()); } }
2.将此bean用spring管理
<bean name="quartzTestBean" class="cn.zan.util.QuartzTest" scope="prototype"> </bean>
3.定义jobdetail
<bean name="quartzTestJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="quartzTestBean" /> <property name="targetMethod" value="execute"/> </bean>
4.定义一个trigger,每十秒一趟
<bean name="quartzTestJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="quartzTestJobDetail" /> <property name="cronExpression" value="0/10 * * * * ?" /> </bean>
5.初始化scheduler,并指定了quartz配置文件的位置
<!--此bean的name可以随意,spring手册上这块甚至是空着的 --> <bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="configLocation" value="classpath:quartz.properties"/> <property name="triggers"> <list> <ref bean="quartzTestJobTrigger"/> </list> </property> </bean>
6.建立quartz集群的数据库,用的是mysql,脚本在附件
7.配置quartz,指定数据库名称、用户名、密码等
#============================================================================ # Configure Main Scheduler Properties #============================================================================ #唯一标识,同一个集群的名称必须一致 org.quartz.scheduler.instanceName = MyClusteredScheduler #auto,则quartz会根据时间和主机名生成,确保唯一 org.quartz.scheduler.instanceId = AUTO #============================================================================ # Configure ThreadPool #============================================================================ org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount = 25 org.quartz.threadPool.threadPriority = 5 #============================================================================ # Configure JobStore #============================================================================ org.quartz.jobStore.misfireThreshold = 60000 #jobstoretx则任务会被持久化到数据中,默认为RAMJobStore,默认会被维护到内存中,集群的时候必须修改 org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.useProperties = false org.quartz.jobStore.dataSource = myDS org.quartz.jobStore.tablePrefix = QRTZ_ #ture则此实例需要参加到集群中 org.quartz.jobStore.isClustered = true org.quartz.jobStore.clusterCheckinInterval = 20000 #============================================================================ # Configure Datasources #============================================================================ org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver org.quartz.dataSource.myDS.URL = jdbc\:mysql\://192.168.1.109\:3306/test?useUnicode\=true&characterEncoding\=utf-8 org.quartz.dataSource.myDS.user = root org.quartz.dataSource.myDS.password = 123456 org.quartz.dataSource.myDS.maxConnections = 10 org.quartz.dataSource.myDS.validationQuery=select 0 from dual
8.理论上这就行了,实际上你会发现这不行,spring的bug啊,附件有两个类,BeanInvokingJobDetailFactoryBean、MethodInvokingJobDetailFactoryBean,重写下默认包里的,这两个内容来自https://jira.springsource.org/browse/SPR-3797
这样,你再启动的时候,就能看到如下内容,证明集群成功了
3-5-23 21:49:04 org.springframework.scheduling.quartz.SchedulerFactoryBean initSchedulerFactory 信息: Loading Quartz config from [class path resource [quartz.properties]] 2013-5-23 21:49:04 org.quartz.core.SchedulerSignalerImpl <init> 信息: Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl 2013-5-23 21:49:04 org.quartz.core.QuartzScheduler <init> 信息: Quartz Scheduler v.1.8.4 created. 2013-5-23 21:49:04 org.quartz.impl.jdbcjobstore.JobStoreSupport initialize 信息: Using db table-based data access locking (synchronization). 2013-5-23 21:49:04 org.quartz.impl.jdbcjobstore.JobStoreTX initialize 信息: JobStoreTX initialized. 2013-5-23 21:49:04 org.quartz.core.QuartzScheduler initialize 信息: Scheduler meta-data: Quartz Scheduler (v1.8.4) 'quartzScheduler' with instanceId 'frady0021369316944640' Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. NOT STARTED. Currently in standby mode. Number of jobs executed: 0 Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 25 threads. Using job-store 'org.quartz.impl.jdbcjobstore.JobStoreTX' - which supports persistence. and is clustered. 2013-5-23 21:49:04 org.quartz.impl.StdSchedulerFactory instantiate 信息: Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. 2013-5-23 21:49:04 org.quartz.impl.StdSchedulerFactory instantiate 信息: Quartz scheduler version: 1.8.4 2013-5-23 21:49:04 org.quartz.core.QuartzScheduler setJobFactory 信息: JobFactory set to: org.springframework.scheduling.quartz.AdaptableJobFactory@dd20b6
9.that's all,enjoy it.
一个要注意的问题:如果集群的容易在不同的物理服务器上,那么必须有一个时间同步的方案,来确保时间的同步。可以使用NTP,具体参照:http://stunizhengjia.iteye.com/admin/blogs/2228199
附件包含上面提到和写到的几处内容。
不包含如何搭建spring环境,这个我假设你已经会了
最后试了下目前最新版本的quartz和spring,在集群的时候仍然会有class序列化的问题,看来spring根本就不鸟quartz,这样一个简单的问题,一直都不给于解决。
相关推荐
Quartz集群需要将所有调度信息(如Job、Trigger)存储在一个共享的持久化存储中,以便所有集群节点都能访问。这通常通过实现`ISchedulerFactory`接口的`StdSchedulerFactory`类和数据库连接来完成。数据库可以选择...
在Quartz集群中,多个Quartz服务器共享同一个“作业存储”(Job Store),这个存储可以是关系数据库或者分布式的存储系统。当一个服务器触发一个作业时,其他服务器会看到这个作业已经被触发,因此不会重复执行。这...
一个基于springboot的quartz集群dome。 向http://localhost:9090/job/addjob注入3个参数 类名:(及时定时任务的类如:com.ybjdw.site.job.NewJob) 组名:随意 定时启动方法:如“0/3 * * * * ?”(每3秒启动一次...
Quartz集群是为了实现高可用性和负载均衡,当一个节点故障时,其他节点能够接管任务,保证服务不中断。 在Quartz集群中,数据库扮演了至关重要的角色,因为它存储了所有关于作业和触发器的信息。集群中的各个节点...
在压缩包文件"oa_ssh"中,可能包含了项目的所有源代码、配置文件、数据库脚本等资源,开发者可以通过这些文件了解和学习SSH框架与Quartz集群的整合实现,以及RABC权限管理的具体细节。通过研究和实践,可以深入理解...
本篇将基于"quartz集群完整应用实例"来深入探讨Quartz的集群配置与实现。 Quartz的核心概念包括Job(任务)、Trigger(触发器)和Scheduler(调度器)。Job是执行的具体任务,Trigger定义了任务何时运行,而...
Quartz集群通过共享内存中的状态来实现任务的分配和执行,当一个节点失败时,其他节点能够接管未完成的任务。实现Quartz集群,需要配置多个Quartz服务器共享同一份数据库存储,用于保存Job、Trigger以及运行状态等...
在构建Quartz集群时,为了实现高可用性和任务的分布式处理,需要在多个节点之间共享状态信息,这就涉及到数据库的支持。数据库在这里起到了存储作业和触发器信息的作用,确保在集群中的各个节点间能够正确协调和执行...
在IT行业中,Spring框架是Java应用开发中的基石,而Quartz则是广泛...通过上述步骤,你已经掌握了Spring集成Quartz集群配置的基本概念。在实践中,根据具体需求调整配置,可以实现高效、稳定且可扩展的任务调度系统。
5. **集群配置**:为了实现高可用的Quartz集群,你需要配置多个节点共享同一个数据库存储的作业和触发器信息。Quartz支持多种持久化策略,如JDBC、RAMJobStore等,选择数据库存储能保证在集群中的任务状态一致性。 ...
本文章是关于springboot集成quartz集群的步骤,LZ亲测。
当需要在分布式环境中运行多个Quartz实例以实现高可用性和负载均衡时,就需要进行Quartz集群配置。 在Spring集成Quartz的过程中,主要涉及以下几个核心概念和步骤: 1. **Job与Trigger**:Job是Quartz中的任务接口...
"quartz集群各种数据库建表脚本" 提供了在不同类型的数据库中创建Quartz集群所需的表结构。基于quartz2.2.1版本,这个脚本应该包含了创建必要的调度表,如QRTZ_JOB_DETAILS、QRTZ_TRIGGERS、QRTZ_SIMPLE_TRIGGERS等...
下面将详细阐述Quartz集群的配置以及示例源码的相关知识点。 **1. Quartz集群的核心概念** - **Job Store**: Quartz集群的关键在于共享任务存储,Job Store负责存储Job(任务)和Trigger(触发器)的信息。常见的...
java + quartz实现定时任务,实现集群配置,在集群环境下多节点运行定时Quartz定任务,就会存在重复处理任务的现象,为解决这一问题,下面我将介绍使用 Quartz 的 TASK ( 12 张表)实例化到数据库,基于数据库自动...
Quartz集群则是在单个Quartz实例的基础上,通过多台服务器的协作来提高系统的可用性和容错性,确保即使在单个节点故障时,作业仍然能够被正确地调度和执行。 在Quartz集群中,每个节点都是一个独立的Quartz ...
Quartz集群是基于Java的开源任务调度框架,用于在分布式环境中执行定时任务。它提供了高度可配置性、灵活的表达式以及对作业和触发器的持久化支持。Quartz允许开发者创建作业(Job)和触发器(Trigger),并安排它们...