quartz 集群环境配置

quartz是很好与spring结合,进行定时任务控制,但在集群环境下怎么去配置呢?
在集群环境下需要做一下几个步骤:
1、下载quartz相应版本的数据库表(11张),把对应版本的数据库表导入到数据库中

2.在项目src下新建quartz.properties
#============================================================================
# Configure JobStore  
# Using Spring datasource in quartzJobsConfig.xml
# Spring uses LocalDataSourceJobStore extension of JobStoreCMT
#============================================================================
org.quartz.jobStore.useProperties=true
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 5000
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.txIsolationLevelReadCommitted = true
 
# Change this to match your DB vendor
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
 

#============================================================================
# Configure Main Scheduler Properties  
# Needed to manage cluster instances
#============================================================================
org.quartz.scheduler.instanceId=AUTO
org.quartz.scheduler.instanceName=MY_CLUSTERED_JOB_SCHEDULER
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false


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

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

<beans>

	<!-- 配置数据源 -->
	<bean id="quartz_dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />		
		
		<property name="url" value="jdbc:mysql://localhost:3306/weichuxing?characterEncoding=UTF-8" />
		<property name="username" value="root" />
		<property name="password" value="root" />	
		
				
		<property name="maxActive" value="5" />
		<property name="maxIdle" value="3" />
		<property name="validationQuery"> 
			<value>SELECT 1</value> 
		</property> 
		<property name="testOnBorrow"> 
			<value>true</value> 
		</property> 
	</bean>
	
	<!-- 配置事务管理器 -->
	<bean id="quartz_transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="quartz_dataSource" />
	</bean>	
	
	<!-- 服务端定时推送消息给终端 -->	 
	<bean id="serverPushJobTask" class="org.springframework.scheduling.quartz.JobDetailBean">
        <property name="jobClass" value="cn.xzyd88.event.quartz.ServerPushMessageQuartzSupport" />
        <property name="requestsRecovery" value="false"/>
    </bean>
    
	<bean id="serverPushTrigger" class="com.tool.PersistableCronTriggerFactoryBean">
		<property name="jobDetail">
			<ref bean="serverPushJobTask" />
		</property>
		<!-- cron表达式 (秒 分 小时 日 月 星期)-->
		<property name="cronExpression">
			<value>0 */2 * * * ?</value>
		</property>
	</bean>
		
	<!-- 定义redis同步数据到数据库触发时间 -->
	<bean id="redisJobTask" class="org.springframework.scheduling.quartz.JobDetailBean">
        <property name="jobClass" value="cn.xzyd88.event.quartz.SynchronizationRedisSupport" />
        <property name="requestsRecovery" value="false"/>
    </bean>
	<bean id="redisTrigger" class="com.tool.PersistableCronTriggerFactoryBean">
		<property name="jobDetail">
			<ref bean="redisJobTask" />
		</property>
		<!-- cron表达式 (秒 分 小时 日 月 星期)-->
		<property name="cronExpression">
			<value>0 */1 * * * ?</value>
		</property>
	</bean>		
		<!-- 订单超时处理类 -->
	<bean id="delayHandler" class="cn.xzyd88.order.guard.OrderDelayHandler"></bean>
	<!-- 定义调用对象和调用对象的方法 -->
	<bean id="delayHandlerTask"
		class="org.springframework.scheduling.quartz.JobDetailBean">
		<!-- 调用的类 -->
		<property name="jobClass" value="cn.xzyd88.event.quartz.OderDelayHandlerSupport">
		</property>
		 <property name="requestsRecovery" value="false"/>
	</bean>
		<!-- 定义触发时间 -->
	<bean id="delayHandlerTime" class="com.tool.PersistableCronTriggerFactoryBean">
		<property name="jobDetail">
			<ref bean="delayHandlerTask" />
		</property>
		<!-- cron表达式 (秒 分 小时 日 月 星期)  每小时清空一次-->
		<property name="cronExpression">
			<value>0 */1 * * * ?</value>
		</property>
	</bean>
	<!-- 客服通知定时job -->
	<bean id="notificationJob" class="cn.xzyd88.tordercar.TOrderCarRuning">
		<property name="mgrTCarRuningService1" ref="mgrTCarRuningService1"></property> 
		<property name="mgrTOrderCarService1" ref="mgrTOrderCarService1"></property> 
		<property name="byPhoneService" ref="byPhoneService"></property> 
		<property name="mgrCustomerService1" ref="mgrCustomerService1"></property> 
	</bean>
	<bean id="notificationTask" class="org.springframework.scheduling.quartz.JobDetailBean">
		<property name="jobClass" value="cn.xzyd88.event.quartz.NotificationSupport" />
        <property name="requestsRecovery" value="false"/>
	</bean>		
	<bean id="notificationTrigger" class="com.tool.PersistableCronTriggerFactoryBean">
		<property name="jobDetail">
			<ref bean="notificationTask" />
		</property>
		<!-- cron表达式 (秒 分 小时 日 月 星期)-->
		<property name="cronExpression">
			<value>0 0/5 9,23 * * ?</value>
		</property>
	</bean>	
	
	
	<!-- 企业订单超时处理job -->
	<bean id="enterpriseOrderTimeOutJob" class="com.tool.QuartzJob">
	  <property name="mgrTOrderCancelCountService1" ref="mgrTOrderCancelCountService1"></property> 
	  <property name="mgrTSysparaService1" ref="mgrTSysparaService1"></property> 
	</bean>
	<bean id="enterpriseOrderTimeOutTask" class="org.springframework.scheduling.quartz.JobDetailBean">
        <property name="jobClass" value="cn.xzyd88.event.quartz.EnterpriseOrderTimeOutSupport" />
        <property name="requestsRecovery" value="false"/>
    </bean>	
	<bean id="enterpriseOrderTrigger" class="com.tool.PersistableCronTriggerFactoryBean">
		<property name="jobDetail">
			<ref bean="enterpriseOrderTimeOutTask" />
		</property>
		<!-- cron表达式 (秒 分 小时 日 月 星期)  每小时清空一次-->
		<property name="cronExpression">
			<value>0 0 0/4 * * ? </value>
		</property>
	</bean>
	
	
	
    <bean id="quertz_executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
         <property name="corePoolSize" value="10" />
         <property name="maxPoolSize" value="100" />
         <property name="queueCapacity" value="500" />
    </bean>
    
	<bean id="startQuertz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="configLocation" value="classpath:/quartz.properties" />
        <property name="dataSource" ref="quartz_dataSource" />
        <property name="transactionManager" ref="quartz_transactionManager" />
        <property name="schedulerName" value="xzyd_quartzScheduler" />
        <property name="overwriteExistingJobs" value="true" />
        <property name="startupDelay" value="1"/>
        <property name="applicationContextSchedulerContextKey" value="applicationContext" /> 
        <property name="jobFactory">
            <bean class="com.tool.AutowiringSpringBeanJobFactory" />
        </property>
		<property name="triggers">
			<list>
				<ref bean="serverPushTrigger" />
				<ref bean="redisTrigger" />  
				<ref bean="notificationTrigger" />
				<ref bean="enterpriseOrderTrigger" />   
				<ref bean="delayHandlerTime" />   
			</list>
		</property>
		<property name="jobDetails">
            <list>
                <ref bean="serverPushJobTask" />
                <ref bean="redisJobTask" />
                <ref bean="notificationTask" />
                <ref bean="enterpriseOrderTimeOutTask" /> 
                <ref bean="delayHandlerTask" /> 
            </list>
        </property>
        <property name="taskExecutor" ref="quertz_executor" />      
	</bean>

</beans>

4.重写org.springframework.scheduling.quartz.CronTriggerBean
PersistableCronTriggerFactoryBean.java
package com.tool;

import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.JobDetailAwareTrigger;

/**
 * Needed to set Quartz useProperties=true when using Spring classes,
 * because Spring sets an object reference on JobDataMap that is not a String
 * 
 * @see http://site.trimplement.com/using-spring-and-quartz-with-jobstore-properties/
 * @see http://forum.springsource.org/showthread.php?130984-Quartz-error-IOException
 */
public class PersistableCronTriggerFactoryBean extends CronTriggerFactoryBean {
    @Override
    public void afterPropertiesSet() {
        super.afterPropertiesSet();
 
        //Remove the JobDetail element
        getJobDataMap().remove(JobDetailAwareTrigger.JOB_DETAIL_KEY);
    }
}

5.jobClass 继承QuartzJobBean 重写
EnterpriseOrderTimeOutSupport.java
package cn.xzyd88.event.quartz;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

import com.tool.QuartzJob;
import com.tool.SpringContextUtil;

public class EnterpriseOrderTimeOutSupport extends QuartzJobBean {
	@Override
	protected void executeInternal(JobExecutionContext arg0)
			throws JobExecutionException {
		QuartzJob quartzJobObj = (QuartzJob) SpringContextUtil.getBean("enterpriseOrderTimeOutJob");
		quartzJobObj.work();
	}
}


6.把应用部署到不同环境下,进行测试。

猜你喜欢

转载自open023.iteye.com/blog/2251990