这几天给Spring+Quartz的集群折腾得死去活来,google了无数页总算搞定,记下一些要点备以后使用。
单独的Quartz集群在
http://unmi.blogjava.net/有Unmi翻译的Quartz Job Scheduling Framework一书做了详细说明,在此不再重复。
Spring+Quartz不集群的方式google百度也可以搜索出来一大堆,同样略过。
要点1 在Spring中使用Quartz的高级配置
问题描述 Quartz集群仅能使用JDBC JobStore工作,需要在Spring中使用Quartz的高级配置
解决办法1.1 通过SchedulerFactoryBean的configLocation属性指定Quartz配置文件的位置。
<bean id="quartzJobFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="clusterTesterJobScheduledTask" />
</list>
</property>
<property name="configLocation" value="classpath:quartz.properties" />
</bean>
解决办法1.2 通过SchedulerFactoryBean的quartzProperties属性直接配置。
要点2 NotSerializableException
问题描述 在将Quartz的Job持久化到数据库的过程中产生NotSerializableException。详细异常信息为:
java.io.NotSerializableException: Unable to serialize JobDataMap for insertion into database because the value of property 'methodInvoker' is not serializable: org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
解决办法 这是Spring的一个Bug,具体解决方案见
http://jira.springframework.org/browse/SPR-3797,上面有解决的MethodInvokingJobDetailFactoryBean代码。
要点3 还是NotSerializableException
问题描述 虽然MethodInvokingJobDetailFactoryBean的问题解决了,但是QuartzJob或者QuartzJob的属性没有实现Serializable接口(比如在QuartzJob中注入了DAO)。
解决办法3.1 如果是自己可以掌握的代码,可以为这些QuartzJob及其属性都加上实现Serializable接口。
解决办法3.2 编写一个实现Serializable接口,没有属性的QuartzJob,让它从Spring容器(ApplicationContext)中获取原来的那个QuartzJob的Bean,再调用原来QuartzJob的方法解决问题。该方法的问题在于怎么获取ApplicationContext,如果用ClassPathXmlApplicationContext,等于是另外创建了一个Spring容器(web.xml里面定义的是另外一个)。
解决办法3.3 将原有的接口暴露,在Job中想办法远程调用该接口。
这三种办法各有好坏,现在也想不出其他更好的办法,先用这些顶着吧。
要点4 集群之后把其中一个Quartz服务停了,其他的也不接手工作
问题描述 集群之后,A节点执行了大多数任务,B节点大部分时间处于空闲,停掉A节点,B节点也不会接手工作。
解决办法 修改Quartz的配置,将每个节点的org.quartz.scheduler.instanceId设置为不同的值,或者都设置为AUTO。另外org.quartz.jobStore.isClustered属性必须设为true,org.quartz.jobStore.clusterCheckinInterval属性为集群中每次检查的时间间隔(按我的理解,应该差不多等于一个服务器挂了之后,其他服务器接手的时间),单位为毫秒,默认值是15000。
要点5 MethodInvokingJobDetailFactoryBean几个属性的作用
问题描述 MethodInvokingJobDetailFactoryBean中concurrent和shouldRecover属性的作用
解释 concurrent为true,则允许一个QuartzJob并发执行,否则就是顺序执行。例如QuartzJob A执行时间为15秒,配置为每10秒执行一次;如果concurrent为true,则0秒的时候启动一次A,10秒的时候再启动一次A,20秒的时候再启动一次A,不管前面启动的A有没有执行完;如果concurrent为false,则0秒的时候启动一次A,15秒的时候A执行完毕,再第二次启动A。
shouldRecover属性为true,则当Quartz服务被中止后,再次启动或集群中其他机器接手任务时会尝试恢复执行之前未完成的所有任务。例如QuartzJob B,在每次00秒的时候启动,假如在03:00的任务执行完之后服务器1被中止,服务器2在05:15的时候才接手;如果shouldRecover属性为true,则服务器2会尝试着补回原来在04:00和05:00的时候应该做的任务,如果shouldRecover属性为false,则服务器2只会从06:00的时候再执行B。
附件是一个Demo,使用数据库为Oracle,创建数据库表的SQL脚本可以在Quartz的发行包(
http://www.opensymphony.com/quartz/download.action)中\docs\dbTables目录下找到。数据库相关配置都在quartz.properties中,可根据实际需要自行修改。
分享到:
相关推荐
java + quartz实现定时任务,实现集群配置,在集群环境下多节点运行定时Quartz定任务,就会存在重复处理任务的现象,为解决这一问题,下面我将介绍使用 Quartz 的 TASK ( 12 张表)实例化到数据库,基于数据库自动...
最近项目中使用了spring+Quartz定时任务、但是项目最近要集群部署、多个APP下如何利用Quartz 协调处理任务。 大家可以思考一下、现在有 A、B、C三个应用同时作为集群服务器对外统一提供服务、每个应用下各有一个...
至于数据库,Quartz集群需要一个共享的数据库存储job和trigger的信息,这就是`dbTables`文件所涉及的内容。Quartz会在数据库中创建一系列的表,用于存储任务元数据,如job信息、trigger信息等。这些表的设计和初始化...
"定时框架spring+quartz"的结合,就是将Quartz的定时功能与Spring的强大集成能力完美融合,为开发者提供了一种高效、灵活的定时任务解决方案。 Spring框架提供了多种方式来管理定时任务,包括使用Spring的`@...
在Quartz集群中,多个Quartz服务器节点共享同一个作业和触发器的信息,当一个节点失败时,其他节点可以接管任务执行,确保服务的连续性。Quartz使用数据库存储作业和触发器的状态,实现集群间的同步。 4. **Spring...
Quartz 还具有集群功能,可以确保在多服务器环境中任务的可靠执行。 当 Spring 与 Quartz 结合使用时,Spring 可以通过其强大的容器管理和配置能力,将 Quartz 集成到应用程序中。例如,Spring 提供了 `org.spring...
Spring Boot + Quartz 集群搭建的完整步骤 Spring Boot 是一个流行的 Java 框架,用于快速构建基于 Spring 的应用程序。Quartz 是一个流行的开源作业调度框架,可以用于实现定时任务的调度。 Spring Boot + Quartz ...
- **集群支持**:Quartz支持多节点集群,当一个节点失败时,任务可以由其他节点接管。 - **Job持久化**:Quartz可以通过JDBC或RAMJobStore等方式持久化Job,保证任务不会因应用重启而丢失。 - **Job状态管理**:...
Spring + quartz 定时任务修改定时时间不重启服务
在压缩包文件"oa_ssh"中,可能包含了项目的所有源代码、配置文件、数据库脚本等资源,开发者可以通过这些文件了解和学习SSH框架与Quartz集群的整合实现,以及RABC权限管理的具体细节。通过研究和实践,可以深入理解...
Quartz支持从数据库存储作业和触发器,这样可以方便地进行任务的持久化和集群环境下的任务同步。 1. **Spring与Quartz的集成**:Spring提供了与Quartz的无缝集成,通过`Spring-Job`和`Spring-Trigger`接口,我们...
在IT行业中,Spring Boot和Quartz是两个非常重要的框架,它们在企业级应用开发中扮演着关键角色。Spring Boot简化了Spring应用的初始搭建以及开发过程,提供了开箱即用的功能,而Quartz则是一个强大的任务调度库,常...
本文将详细讲解如何结合Spring 4.0.6版本和Quartz 2.2.3版本来实现一个集群示例,帮助你理解和掌握相关知识点。 首先,让我们了解Spring 4.0.6。这是Spring框架的一个稳定版本,提供了许多增强功能和性能优化。...
为了实现Quartz集群,还需要注意以下几点: 1. 数据源配置:确保Quartz能够访问一个共享的数据源,以便所有节点可以读写相同的调度信息。 2. 集群节点ID(instanceId):每个节点的instanceId应不同,以区分不同的...
Quartz 2 提供了更稳定、更健壮的调度功能,支持集群环境,可以在分布式系统中协调任务执行。它可以用来安排任务的触发,如定时发送邮件、执行数据清理等。Quartz 2 的API允许开发者方便地创建、修改和删除作业及...
在IT行业中,Spring框架是Java应用开发中的基石,而Quartz则是广泛...通过上述步骤,你已经掌握了Spring集成Quartz集群配置的基本概念。在实践中,根据具体需求调整配置,可以实现高效、稳定且可扩展的任务调度系统。
在这个“quartz_springbatch_dynamic”项目中,我们将看到如何将这两个强大的工具结合起来,以实现动态集群环境中的定时任务执行,并使用MySQL作为数据存储。 Quartz是一个开源的作业调度框架,允许开发者创建、...
- 考虑使用监控工具(如Prometheus+Grafana)监控Quartz集群的运行状态,以便及时发现和解决问题。 通过以上知识点的学习和实践,开发者可以熟练掌握在Spring环境中使用Quartz实现分布式集群的作业调度,提升系统...
【Spring集成Quartz定时任务与数据库实现集群详解】 在企业级应用中,定时任务的管理是必不可少的一部分,Spring框架提供了与Quartz的集成,使得我们可以方便地创建和管理定时任务。Quartz是一款强大的、开放源代码...