quartz集成spring下的集群配置

写在前头

   
spring3.0
以后就开始支持quartz2.x,因为org.quartz.CronTrigger2.0class变成了一个interface,Spring4.0.6配置文件中使用CronTriggerFactoryBean来集成quartz2.x,使用CronTriggerBean来集成quartz1.8.x及以前版本.

准备环境

我用的是spring4.0.6 + quartz 2.1.7

1. quartz官网:http://www.quartz-scheduler.org/

2. spring集成环境

<dependency> 
    <groupId>org.quartz-scheduler</groupId> 
    <artifactId>quartz</artifactId> 
    <version>2.1.7</version> 
</dependency> 
<dependency> 
    <groupId>org.quartz-scheduler</groupId> 
    <artifactId>quartz-oracle</artifactId> 
    <version>2.1.7</version> 
</dependency> 
<dependency> 
    <groupId>org.quartz-scheduler</groupId> 
    <artifactId>quartz-weblogic</artifactId> 
    <version>2.1.7</version> 
</dependency> 
<dependency> 
    <groupId>org.quartz-scheduler</groupId> 
    <artifactId>quartz-jboss</artifactId> 
    <version>2.1.7</version> 
</dependency> 

环境搭建

1.      创建数据库表结构

文件路径:quartz-2.1.7\docs\dbTables\*.sql

选择对应数据库的脚本,然后执行。我选择的ORACLE.

 

2.      创建quartz.properties文件

#============================================================================ 
# Configure Main Scheduler Properties   
#============================================================================ 
org.quartz.scheduler.instanceName = EventScheduler    
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  
  
 
#============================================================================ 
# Configure JobStore   
#============================================================================ 
org.quartz.jobStore.misfireThreshold = 60000  
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX 
# mysql  
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate 
# Oracle  
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.oracle.OracleDelegate   
org.quartz.jobStore.tablePrefix = QRTZ_  
org.quartz.jobStore.maxMisfiresToHandleAtATime=10  
org.quartz.jobStore.isClustered = true   
org.quartz.jobStore.clusterCheckinInterval = 20000  

3.      创建spring配置文件applicationContext-job.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:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xsi:schemaLocation="     

http://www.springframework.org/schema/beans


http://www.springframework.org/schema/beans/spring-beans.xsd


http://www.springframework.org/schema/context


http://www.springframework.org/schema/context/spring-context.xsd


http://www.springframework.org/schema/mvc


http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd


http://www.springframework.org/schema/util

        http://www.springframework.org/schema/util/spring-util-3.2.xsd"> 
    <bean id="jobService" class="com.test.service.TestJobservice"/> 
    <!-- 定义任务 --> 
    <bean id="vcaEventJobTask" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> 
        <property name="jobClass"> 
            <!-- 上面的任务代理类 --> 
            <value>com.test.service.DetailQuartzJobBean</value> 
        </property> 
        <property name="jobDataAsMap"> 
            <map> 
                <!-- 实际的任务的Bean name,填上EventMonitorService的Bean name --> 
                <entry key="targetObject" value="jobService" /> 
                <!-- 执行Bean中的哪个方法 --> 
                <entry key="targetMethod" value="executeTask" /> 
            </map> 
        </property> 
        <property name="durability" value="true"></property>  
    </bean> 
  
    <!-- 任务触发器 --> 
    <bean id="eventTaskTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> 
        <property name="jobDetail"> 
            <!-- 任务代理Bean name --> 
            <ref bean="vcaEventJobTask" /> 
        </property> 
        <property name="cronExpression"> 
            <!-- 配置表达式,这里表示每五分钟执行一次 --> 
            <value>0 0/1 * * * ?</value> 
        </property> 
    </bean> 
    <!-- 任务调度入口 --> 
    <bean autowire="no" 
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
        <property name="dataSource"> 
            <ref bean="dataSource" /> 
        </property> 
        <!-- 任务列表,可以配置多个任务加入到该List --> 
        <property name="triggers"> 
            <list> 
               <ref bean="eventTaskTrigger"/>   
            </list> 
        </property> 
        <property name="configLocation" value="classpath:quartz.properties" /> 
        <property name="applicationContextSchedulerContextKey" value="applicationContext" /> 
        <property name="startupDelay" value="30" /> 
        <property name="autoStartup" value="true" /> 
        <property name="overwriteExistingJobs" value="true" /> 
    </bean> 
</beans> 

4.      创建任务类

代理类DetailQuartzJobBean.java

package com.test.service; 
import java.lang.reflect.Method; 
 
 
import org.quartz.JobExecutionContext; 
import org.quartz.JobExecutionException; 
import org.springframework.context.ApplicationContext;  
import org.springframework.scheduling.quartz.QuartzJobBean; 
 
public class DetailQuartzJobBean extends QuartzJobBean { 
     private ApplicationContext applicationContext;   
      
     private String targetObject; 
      
    private String targetMethod; 
      
     public String getTargetObject() { 
        return targetObject; 
    } 
 
 
    public void setTargetObject(String targetObject) { 
        this.targetObject = targetObject; 
    } 
 
    public String getTargetMethod() { 
        return targetMethod; 
    } 
 
    public void setTargetMethod(String targetMethod) { 
        this.targetMethod = targetMethod; 
    } 
 
 
    public ApplicationContext getApplicationContext() {  
        return applicationContext; 
    } 
       
     /** 
       * 从SchedulerFactoryBean注入的applicationContext. 
       */   
     public void setApplicationContext(ApplicationContext applicationContext) {   
        this.applicationContext = applicationContext;   
    }   
       
        @Override   
    protected void executeInternal(JobExecutionContext ctx) 
            throws JobExecutionException { 
        try { 
 
 
            // logger.info("execute [" + targetObject + "] at once>>>>>>"); 
            Object otargetObject = applicationContext.getBean(targetObject); 
            Method m = null; 
            try { 
                m = otargetObject.getClass().getMethod(targetMethod, 
                        new Class[] {}); 
                m.invoke(otargetObject, new Object[] {}); 
            } catch (SecurityException e) { 
                // logger.error(e); 
            } catch (NoSuchMethodException e) { 
                // logger.error(e); 
            } 
 
 
        } catch (Exception e) { 
            throw new JobExecutionException(e); 
        } 
    } 
} 

目标类TestJobservice.java

package com.test.service; 
 
import java.text.SimpleDateFormat; 
import java.util.Date; 
 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
 
public class TestJobservice { 
 
    private static final transient Logger logger = LoggerFactory.getLogger(TestJobservice.class);   
     
    public void executeTask() { 
        logger.info("executing at " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); 
    } 
}