`
no_bao
  • 浏览: 315279 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Quartz在Spring中集群 Quartz引用外部数据源

阅读更多

转载于  http://www.iteye.com/topic/486055

 

概述 

虽然单个Quartz实例能给予你很好的Job调度能力,但它不能满足典型的企业需求,如可伸缩性、高可靠性满足。假如你需要故障转移的能力并能运行日益增多的 Job,Quartz集群势必成为你应用的一部分了。使用 Quartz 的集群能力可以更好的支持你的业务需求,并且即使是其中一台机器在最糟的时间崩溃了也能确保所有的 Job 得到执行。 

Quartz 中集群如何工作 

一个 Quartz 集群中的每个节点是一个独立的 Quartz 应用,它又管理着其他的节点。意思是你必须对每个节点分别启动或停止。不像许多应用服务器的集群,独立的 Quartz 节点并不与另一其的节点或是管理节点通信。Quartz 应用是通过数据库表来感知到另一应用的。 

图:表示了每个节点直接与数据库通信,若离开数据库将对其他节点一无所知 
 

创建Quartz数据库表 

因为Quartz 集群依赖于数据库,所以必须首先创建Quartz数据库表。Quartz 包括了所有被支持的数据库平台的 SQL 脚本。在 <quartz_home>/docs/dbTables 目录下找到那些 SQL 脚本,这里的 <quartz_home> 是解压 Quartz 分发包后的目录。 
这里采用的Quartz 1.6.5版本,总共12张表,不同版本,表个数可能不同。数据库为mysql,用tables_mysql_innodb.sql创建数据库表。 

配置数据库连接池 

1.配置jdbc.properties文件 

 

引用

jdbc.driverClassName=com.mysql.jdbc.Driver 
jdbc.url=jdbc:mysql://localhost:3306/quartz?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true 
jdbc.username=root 
jdbc.password=kfs 



2.配置applicationContext.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" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:jee="http://www.springframework.org/schema/jee" 
    xsi:schemaLocation=" 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd 
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
     http://www.springframework.org/schema/jee 
       http://www.springframework.org/schema/jee/spring-jee-2.5.xsd"  > 
  
   <context:component-scan base-package="com.sundoctor"/> 

<!-- 属性文件读入 --> 
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
<property name="locations"> 
<list> 
<value>classpath:jdbc.properties</value> 
</list> 
</property> 
</bean> 

<!-- 数据源定义,使用c3p0 连接池 --> 
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
<property name="driverClass" value="${jdbc.driverClassName}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="initialPoolSize" value="5" /> 
<property name="minPoolSize" value="5" /> 
<property name="maxPoolSize" value="20" /> 
<property name="acquireIncrement" value="2" /> 
<property name="maxIdleTime" value="3600" /> 
<property name="idleConnectionTestPeriod"  value="180"/>  
<property name="automaticTestTable" value="C3P0TESTTABLE"/> 
</bean>
</beans> 



创建Job测试服务类 

Java代码   收藏代码
  1. package com.sundoctor.quartz.cluster.example;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import org.slf4j.Logger;  
  6. import org.slf4j.LoggerFactory;  
  7. import org.springframework.stereotype.Service;  
  8.   
  9. @Service("simpleService")  
  10. public class SimpleService implements Serializable{  
  11.       
  12.     private static final long serialVersionUID = 122323233244334343L;  
  13.     private static final Logger logger = LoggerFactory.getLogger(SimpleService.class);  
  14.       
  15.     public void testMethod1(){  
  16.         //这里执行定时调度业务  
  17.         logger.info("testMethod1.......1");  
  18.     }  
  19.       
  20.     public void testMethod2(){  
  21.         logger.info("testMethod2.......2");   
  22.     }  
  23. }  



因为Job需要持久化到数据库中,SimpleService必须实现Serializable接口,在这里只是简单打印一下日志。 

配置 Quartz 使用集群 

1.配置节点的 quartz.properties 文件 

引用

org.quartz.scheduler.instanceName = TestScheduler1   
org.quartz.scheduler.instanceId = AUTO  

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool 
org.quartz.threadPool.threadCount = 10 
org.quartz.threadPool.threadPriority = 5 
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true 

org.quartz.jobStore.misfireThreshold = 60000 
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX 
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate 
org.quartz.jobStore.tablePrefix = QRTZ_ 
org.quartz.jobStore.maxMisfiresToHandleAtATime=10 
org.quartz.jobStore.isClustered = true  
org.quartz.jobStore.clusterCheckinInterval = 20000 


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

org.quartz.scheduler.instanceId 属性为 AUTO即可,基于主机名和时间戳来产生实例 ID。 

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 秒)。 

2.配置applicationContext-quartz.xml文件 

引用

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> 

<beans> 
    <bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
        <property name="dataSource"> 
            <ref bean="dataSource"/> 
        </property> 
        <property name="applicationContextSchedulerContextKey" value="applicationContextKey"/> 
        <property name="configLocation" value="classpath:quartz.properties"/>
<property name="triggers"> 
<list>   
<ref bean="trigger1"/> 
<ref bean="trigger2"/>
</list> 
</property>
    </bean> 
    
    <bean id="jobDetail1" class="frameworkx.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
        <property name="targetObject" ref="simpleService"/> 
        <property name="targetMethod" value="testMethod1"/> 
<property name="shouldRecover" value="true"/> 
    </bean> 
    <bean id="trigger1" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
        <property name="jobDetail" ref="jobDetail1"/> 
        <property name="cronExpression" value="0/5 * * ? * * *"/> 
    </bean>    
  
    <bean id="jobDetail2" class="frameworkx.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
        <property name="targetObject" ref="simpleService"/> 
        <property name="targetMethod" value="testMethod2"/> 
<property name="shouldRecover" value="true"/> 
    </bean> 
    <bean id="trigger2" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> 
        <property name="jobDetail" ref="jobDetail2"/> 
        <property name="startDelay" value="1"/> 
        <property name="repeatCount" value="100"/> 
        <property name="repeatInterval" value="1000"/> 
    </bean>    
</beans> 



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

applicationContextSchedulerContextKey: 是org.springframework.scheduling.quartz.SchedulerFactoryBean这个类中把spring上下 文以key/value的方式存放在了quartz的上下文中了,可以用applicationContextSchedulerContextKey所 定义的key得到对应的spring上下文; 

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

关于Job配置,这里有两点需要注意 
MethodInvokingJobDetailFactoryBean 
在这里使用牛人修改后的frameworkx.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean,可以参考:http://jira.springframework.org/browse/SPR-3797。直接使用org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean会报java.io.NotSerializableException异常。 

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

运行Quartz集群 

在相同或不同的机器上运行com.sundoctor.quartz.cluster.example.test.MainTest进行测试,在本例中只是简单打印一下日志。 

Java代码   收藏代码
  1. package com.sundoctor.quartz.cluster.example.test;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. public class MainTest {  
  7.   
  8.     /** 
  9.      * @param args 
  10.      */  
  11.     public static void main(String[] args) {  
  12.         ApplicationContext springContext = new ClassPathXmlApplicationContext(new String[]{"classpath:applicationContext.xml","classpath:applicationContext-quartz.xml"});  
  13.     }  
  14.   
  15. }  



Quartz 实际并不关心你是在相同的还是不同的机器上运行节点。当集群是放置在不同的机器上时,通常称之为水平集群。节点是跑在同一台机器是,称之为垂直集群。对于垂直集群,存在着单点故障的问题。这对高可用性的应用来说是个坏消息,因为一旦机器崩溃了,所有的节点也就被有效的终止了。 

当你运行水平集群时,时钟应当要同步,以免出现离奇且不可预知的行为。假如时钟没能够同步,Scheduler 实例将对其他节点的状态产生混乱。有几种简单的方法来保证时钟何持同步,而且也没有理由不这么做。最简单的同步计算机时钟的方式是使用某一个 Internet 时间服务器(Internet Time Server ITS)。 

没什么会阻止你在相同环境中使用集群的和非集群的 Quartz 应用。唯一要注意的是这两个环境不要混用在相同的数据库表。意思是非集群环境不要使用与集群应用相同的一套数据库表;否则将得到希奇古怪的结果,集群和非集群的 Job 都会遇到问题。 

假如你让一个非集群的 Quartz 应用与集群节点并行着运行,设法使用 JobInitializationPlugin和 RAMJobStore。 

分享到:
评论

相关推荐

    quartz+spring分布式集群调度

    在Spring的配置文件中,需要声明SchedulerFactoryBean,配置JobStore类型、数据源以及集群相关参数。同时,还需要定义Job和Trigger,指定对应的Spring Bean和执行时间。 六、案例分析 压缩包中的"spring-quartz...

    spring集成quartz集群配置

    这里,`myDS`是数据源的名称,需要与Spring配置中的`dataSource`引用匹配。 当多个Quartz节点在相同的数据库上运行时,它们会形成一个集群。每个节点都可以独立地调度和执行任务,而不会冲突。如果某个节点故障,...

    spring quartz集群配置

    在Spring中集成Quartz,我们需要创建一个`SchedulerFactoryBean`,并配置相关的属性,例如Job Store类型、数据源等。以下是一个基本的配置示例: ```xml &lt;bean id="schedulerFactoryBean" class="org.spring...

    quartz与spring集群Demo

    实例是基于MyEclipse开发的。针对Quartz与Spring做集群的Demo...实例运行依赖Oracle数据库,根据quartz框架包docs/dbTables/目录下的sql脚本文件,创建表结构,修改工程中的Spring数据源配置。 Start.java启动程序。

    Spring+Quartz 集群

    在IT行业中,Spring框架是Java企业级应用开发的首选,而Quartz则是一个强大的任务调度库,常用于实现定时任务。本篇文章将深入探讨如何在Spring环境中集成Quartz以构建一个高可用的集群。 首先,我们需要理解Spring...

    spring 集成quartz 用数据库实现quartz的集群

    2. 在Spring配置文件中创建`SchedulerFactoryBean`,配置数据源和Quartz属性。 3. 配置`quartz.properties`,指定数据库连接和Quartz参数。 4. 设计并实现`Job`和`Trigger`,定义任务逻辑和执行时机。 5. 在集群环境...

    Spring集群整合Quartz

    本文将深入探讨如何在Spring集群环境中整合Quartz,实现高可用、可扩展的定时任务解决方案。 **1. Spring与Quartz的集成** Spring通过Spring Job和Spring Task模块提供了轻量级的任务调度能力,但当面临复杂定时...

    spring4.0.6+quartz 2.2.3 集群示例

    在IT行业中,Spring框架和Quartz库是两个非常重要的组件,它们在企业级应用开发中发挥着关键作用。本文将详细讲解如何结合Spring 4.0.6版本和Quartz 2.2.3版本来实现一个集群示例,帮助你理解和掌握相关知识点。 ...

    Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置

    1. 添加依赖:确保项目中引入了Spring和Quartz的相关库,包括`spring-context-support`和`quartz`。 2. 配置Scheduler:在Spring的配置文件中,使用`SchedulerFactoryBean`来初始化和配置Quartz Scheduler。可以...

    quartz2.2.1 spring3.1.1

    Quartz 2.2.1 和 Spring 3.1.1 是两个在企业级Java应用开发中常用的开源框架。Quartz 是一个强大的、完全可定制的作业调度库,而 Spring 则是Java应用程序的全面框架,它提供了依赖注入、AOP(面向切面编程)、事务...

    Mybatis+Spring+SpringMVC+quartz多数据源切换

    这个项目结合了四个关键的技术组件,它们分别是Mybatis、Spring、SpringMVC和Quartz,下面将详细介绍这些技术以及它们在多数据源切换和跨数据库同步中的应用。 **Mybatis** 是一款轻量级的Java持久层框架,它允许...

    spring+quartz定时集群支持

    Spring框架与Quartz库的结合为开发者提供了强大的定时任务管理能力,尤其在集群环境中,如何确保任务的正确性和一致性成为了一个关键问题。本篇将深入探讨"Spring+Quartz定时集群支持"这一主题。 首先,Spring是...

    spring之定时任务实现(spring-task和quartz等不同方式)

    在IT领域,尤其是在Java开发中,定时任务是一个非常常见的需求,用于执行周期性的任务,比如数据备份、报表生成、系统监控等。Spring框架提供了一系列工具来支持定时任务的实现,其中包括Spring自带的`spring-task`...

    quartz在集群环境下的最终解决方案

    `org.quartz.jobStore.dataSource`: 指定数据源名称。 3. **利用 Spring 框架进行重构** - **Spring 配置**: 1. 使用 `SchedulerFactoryBean` 来创建 Quartz 调度器,并指定 `configLocation` 为 `classpath:...

    Spring整合Quartz

    Spring整合Quartz是一个常见的任务调度解决方案,用于在Java应用程序中执行定时任务。Quartz是一个功能强大的、开放源代码的作业调度框架,而Spring框架则是一个全面的企业级应用开发框架。将两者结合,我们可以利用...

    spring整合quartz使用jdbc存储

    Spring整合Quartz是一款高效的任务调度框架,用于在Java应用程序中定时执行特定任务。Quartz本身支持多种持久化策略,包括使用数据库(JDBC)来存储作业和触发器信息,这使得任务调度信息在系统重启后仍能保留。下面...

    quartz 集群配置

    5. **集群配置**:为了实现Quartz集群,我们需要在`quartz.properties`文件中配置集群相关的参数,如`org.quartz.scheduler.instanceName`(唯一标识每个节点)和`org.quartz.jobStore.isClustered`(设置为true启用...

    spring java 定时器 执行两次 quartz

    在Spring框架中,定时任务是常见的需求,例如用于执行定期数据同步、日志清理或发送邮件等。Quartz是一款强大的开源任务调度库,它能够与Java应用程序无缝集成,实现复杂的时间触发任务。当我们遇到Spring定时器执行...

    spring-quartz jar包

    Spring Quartz 是一个集成Quartz定时任务框架与Spring的开源项目,它使得在Spring应用中配置和管理定时任务变得更加便捷。Quartz是Java平台上的一个强大、完全可移植的作业调度库,可以用来创建复杂的调度任务,而...

    springboot整合quartz定时任务yml文件配置方式

    在Spring Boot应用中整合Quartz定时任务是一种常见的需求,它可以帮助我们执行周期性的后台任务,如数据同步、报表生成等。Spring Boot与Quartz的结合提供了便捷的配置方式,特别是通过YAML(YAML Ain't Markup ...

Global site tag (gtag.js) - Google Analytics