quartz 集群环境配置

2019-03-26 16:14|来源: 网路

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.把应用部署到不同环境下,进行测试。  


转自:http://open023.iteye.com/blog/2251990


相关问答

更多
  • quartz的安装问题[2022-07-03]

    设置好环境变量假设你安装在C:\\Program Files\\jdk1.5.0_02 变量名:JAVA_HOME 变量值:C:\\Program Files\\Java\\j2sdk1.5.0 变量名:Path 变量值:C:\\Program Files\\Java\\j2sdk1.5.0\\bin 变量名:CLASSPATH 变量值:.;C:\\Program Files\\Java\\j2sdk1.5.0\\lib\\tools.jar;C:\\Program Files\\Java\\j2sdk1. ...
  • 我这有一个动态quartz的实例,可以在页面中动态填写job名、cronExpression表达式;要的话把邮箱给我,数据库是mysql的。 另外,记得多加点分给我,15分太少了。我花了半个月才搞定的~_~
  • 我这有一个动态quartz的实例,可以在页面中动态填写job名、cronExpression表达式;要的话把邮箱给我,数据库是mysql的。 另外,记得多加点分给我,15分太少了。我花了半个月才搞定的~_~
  • 橥倍际怯蓂uartz,那么就有可能出现集群,如果所有的都是使用ramStore的形式存储任务,则只需要简单的定义管理器 评论0 0 0 加载更多
  • 你很可能在你的类路径中有两个Quartz JAR副本 - JBoss有自己的副本,你的应用程序也可能在它的lib目录中有一个副本。 两人发生冲突。 从您的应用程序中删除JAR,然后重试。 You most likely have two copies of the Quartz JAR in your classpath - JBoss has its own copy, and your application probably has one too, in its lib directory. The ...
  • 这是一个类加载问题。 JBoss已经在其类路径中使用了org.quartz.spi.ClassLoadHelper.class ,因为JBoss将它用于不同任务的内部计时器。 JBoss提供的quartz.jar位于/jboss-as/common/lib/quartz.jar 。 因此,您正在为您的应用程序提供另一个quartz.jar ,这会导致与JBoss提供的现有石英类冲突。 要解决此问题,您有两种选择: 选项1 。 从你的耳朵中取出石英罐并加以战争。 在我看来,这是更好更容易的选择,除非由于某种原 ...
  • 是的,您需要使用JDBC-JobStore,或者TerracottaJobStore来启用节点相互通信的机制(在一种情况下,它们在db表中进行通信,在另一种情况下通过Terracotta网络功能进行通信)。 Yes, you need to use the JDBC-JobStore, or else the TerracottaJobStore to enable a mechanism for the nodes to communicate with each other (in the one ca ...
  • 您正在JBoss上运行Quartz,因此请考虑使用HASingleton来控制主节点 - 然后您不需要使用Quartz提供的集群,Quartz使用数据库并导致问题。 HASingleton自JBoss 4或5开始提供。如果您使用的是版本7,那么您可以查看这篇文章 ,了解有关其实现的详细信息 I think I have found the solution! I disabled job file's auto scanning by doing this: org.quartz.plugin.jobIni ...
  • 没有不同。 它们基本上是名称 - 价值对。 您可以将一半放在.xml中,如果需要,可以编写一半的代码。 我倾向于把大部分/全部放在.xml中。 No difference. They're basically Name-Value-Pairs. You can put half in .xml, and code up half of them if you want. I tend to put most/all in .xml.
  • 运行quartz.net包中包含的Oracle表创建脚本。 我认为该脚本位于Quartz \ database \ tables \ tables_oracle.sql下 修改Quartz.Config quartz.jobStore.tablePrefix = your table prefix , I think default is QRTZ_ quartz.jobStore.dataSource = myDS quartz.dataSource.myDS.connectionString = y ...