在集群环境下需要做一下几个步骤:
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.把应用部署到不同环境下,进行测试。