Spring3.2.0和Quartz1.8.6集群配置

最近项目中要添加一个后台任务处理的功能,要求做到集群,然后就调研了很多,网上也有好多资料,但在项目中应用时还是有很多问题,最终也找到了解决办法,以下是完整实现。

首先是任务实现类,一个普通的service或bean:

public class EventMonitorService implements Serializable {
	private static final long serialVersionUID = 7026615035981953235L;
	
	private static final Logger LOG = LoggerFactory
			.getLogger(EventMonitorService.class);
        @Autowired
	private EventDao eventDao;
        @Autowired
	private SessionFactory sessionFactory;

	/**
	 * 定时监控方法
	 */
	public void startMonitorEvent() {
		LOG.debug("开始执行定时任务--监控Event超时");
		//自己的业务处理
	}
}
第二步,创建任务代理类DetailQuartzJobBean
import java.lang.reflect.Method;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.quartz.QuartzJobBean;

import com.telematics.tsp.util.SpringContextKit;

public class DetailQuartzJobBean extends QuartzJobBean {
	private static final Logger logger = LoggerFactory
			.getLogger(DetailQuartzJobBean.class);
	private String targetObject;
	private String targetMethod;
	private final ApplicationContext applicationContext;

	public DetailQuartzJobBean() {
		this.applicationContext = SpringContextKit.ME.getApplicationContext();
	}

	@Override
	protected void executeInternal(JobExecutionContext context)
			throws JobExecutionException {
		try {
			Object otargetObject = applicationContext.getBean(targetObject);
			System.out.println(otargetObject.toString());
			Method m = null;
			try {
				m = otargetObject.getClass().getMethod(targetMethod,
						new Class[] {});
				m.invoke(otargetObject, new Object[] {});
			} catch (SecurityException e) {

			} catch (NoSuchMethodException e) {

			}
		} catch (Exception e) {
			throw new JobExecutionException(e);
		}
	}

	public void setTargetObject(String targetObject) {
		this.targetObject = targetObject;
	}

	public void setTargetMethod(String targetMethod) {
		this.targetMethod = targetMethod;
	}
}

这里在获取applicationContext时视项目框架而定,就是获得应用上下文。

第三步,配置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 

第四步,配置quartz.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"
	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">
	<!-- 要调用的工作类 -->
	<bean id="eventMonitorService" class="demo.EventMonitorService"></bean>


	<!-- 定义任务 -->
	<bean id="vcaEventJobTask" class="org.springframework.scheduling.quartz.JobDetailBean">
		<property name="jobClass">
			<!-- 上面的任务代理类 -->
			<value>com.tservice.vca.jobtask.DetailQuartzJobBean</value>
		</property>
		<property name="jobDataAsMap">
			<map>
				<!-- 实际的任务的Bean name,填上EventMonitorService的Bean name -->
				<entry key="targetObject" value="eventMonitorService" />
				<!-- 执行Bean中的哪个方法 -->
				<entry key="targetMethod" value="startMonitorEvent" />
			</map>
		</property>
	</bean>

	<!-- 任务触发器 -->
	<bean id="eventTaskTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail">
			<!-- 任务代理Bean name -->
			<ref bean="vcaEventJobTask" />
		</property>
		<property name="cronExpression">
			<!-- 配置表达式,这里表示每五分钟执行一次 -->
			<value>0 0/5 * * * ?</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 local="eventTaskTrigger" />
			</list>
		</property>
		<property name="configLocation" value="classpath:quartz.properties" />
	</bean>
</beans>
接下来就可以正常启动你的项目了。



你可能感兴趣的:(spring,集群,quartz)