Spring4+Quartz2计划任务集群

原创 2015年12月17日 20:52:18

 项目中经常需要计划任务来定时处理一些事情,Quartz是javaEE项目最常见的计划任务组件,Quartz本身支持集群,和spring结合很容易实现计划任务的配置,但是默认spring的Quartz配置

org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean

并不支持集群模,当项目集群化部署的时候,项目中的计划任务有些事不能重复执行的,所以需要把job调度器换为

org.springframework.scheduling.quartz.JobDetailFactoryBean

并重写其中的jobClass

重写的类:KuanrfQuartzJob.java

package com.kuanrf.common.util;

import java.lang.reflect.Method;

import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.quartz.QuartzJobBean;

/**
 * 重写QuartzJob
 * 
 * 采用反射回调实际的计划任务处理方法
 * 
 * @author lujun.chen
 * @version [版本号, 2015年12月14日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
@DisallowConcurrentExecution
public class KuanrfQuartzJob extends QuartzJobBean {

	// 计划任务所在类
	private String targetObject;

	// 具体需要执行的计划任务
	private String targetMethod;
	private ApplicationContext ctx;

	@Override
	protected void executeInternal(JobExecutionContext context)
			throws JobExecutionException {

		try {
			Object otargetObject = ctx.getBean(targetObject);
			Method m = null;
			try {
				m = otargetObject.getClass().getMethod(targetMethod);
				m.invoke(otargetObject);
			} catch (SecurityException e) {
				e.printStackTrace();
			} catch (NoSuchMethodException e) {
				e.printStackTrace();
			}
		} catch (Exception e) {
			throw new JobExecutionException(e);
		}

	}

	public void setApplicationContext(ApplicationContext applicationContext) {
		this.ctx = applicationContext;
	}

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

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

}

spring配置:application_spring_trigger.xml

targetObject:定义计划任务的类

targetMethod:具体计划任务(方法名)

<bean id="gsTrigger" class="com.kuanrf.gs.trigger.Trigger"/>

<bean id="autoOrderAppraiseStateJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
		<property name="durability" value="true" />
    	<property name="requestsRecovery" value="true" />   
        <property name="jobClass" value="com.kuanrf.common.util.KuanrfQuartzJob"/>
        <property name="jobDataAsMap">  
             <map>  
                  <entry key="targetObject" value="gsTrigger" />  
                  <entry key="targetMethod" value="autoOrderAppraiseState" />  
            </map>  
        </property> 
	</bean>
	<bean id="autoOrderAppraiseStateTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<property name="jobDetail" ref="autoOrderAppraiseStateJob"></property>
		<property name="cronExpression">
			<value> 0 * * * * ? </value>
		</property>
	</bean>

<bean id="KuanrfGSScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="applicationContextSchedulerContextKey" value="applicationContext" />
        <property name="configLocation" value="classpath:config/quartz.properties" />
		<property name="overwriteExistingJobs" value="true" />  
    	<property name="startupDelay" value="30" />
    	<property name="autoStartup" value="true" />
		<property name="triggers">
			<list>
				<ref bean=" autoOrderAppraiseStateTrigger "/>
			</list>
		</property>
	</bean>

Quartz配置文件:quartz.properties

#==============================================================
#Configure Main Scheduler Properties 
#==============================================================
org.quartz.scheduler.instanceName = KuanrfGSQuartzScheduler
org.quartz.scheduler.instanceId = AUTO

#==============================================================    
#Configure JobStore    
#==============================================================   
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 20000  
org.quartz.jobStore.dataSource = myDS
org.quartz.jobStore.maxMisfiresToHandleAtATime = 1
org.quartz.jobStore.misfireThreshold = 120000
org.quartz.jobStore.txIsolationLevelSerializable = true

#==============================================================    
#Configure DataSource    
#==============================================================   
org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL = jdbc:mysql://127.0.0.1:3306/quartz?useUnicode=true&characterEncoding=UTF-8  
org.quartz.dataSource.myDS.user = root  
org.quartz.dataSource.myDS.password = 123456  
org.quartz.dataSource.myDS.maxConnections = 30  
org.quartz.jobStore.selectWithLockSQL = SELECT * FROM {0}LOCKS WHERE LOCK_NAME = ? FOR UPDATE

#==============================================================    
#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

#==============================================================
#Skip Check Update
#update:true
#not update:false
#==============================================================
org.quartz.scheduler.skipUpdateCheck = true

#============================================================================   
# Configure Plugins  
#============================================================================      
org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin   
org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownhook.cleanShutdown = true

参考文献:

http://blog.csdn.net/l1028386804/article/details/49150267

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Spring之——quartz集群的问题及解决方案(基于Spring4.0+quartz2.2.1的集群架构)

特别注意一点,与Spring3.1以下版本整合必须使用Quartz1,最初我拿2.2.1的,怎么搞都报错: Caused by: org.springframework.beans.factory.C...

Spring4+Quartz2集群动态创建任务

公司最近需要使用Quartz集群来实现任务的动态创建和删除,之前自己只是用过配置好的单机版的,而且是定时 执行的任务,正好借这个机会深入学习一下Quartz。      在正式开始之前,我们先来了解下...

spring4与quartz2.2集群配置

1.引入quartz2.2的maven依赖 org.quartz-scheduler quartz 2.2.3 org.quartz-scheduler ...

最新 Spring 4.2.2 集成 Quartz Scheduler 2.2.2 任务调度示例

本文将演示如何通过 Spring 使用 Quartz Scheduler 进行任务调度。Spring 为简化 Quartz 的操作提供了相关支持类。本文示例使用的相关工具如下:Spring 4.2.2...
  • defonds
  • defonds
  • 2015年10月29日 21:20
  • 39547

Spring4实战(二)-Quartz 2.2 集成

前面一篇文章介绍了 Quartz的简单用法,Spring提供了一些类来简化Quartz的使用。本篇文章将介绍如何在Spring中集成Quartz。涉及的开发工具与技术 Spring 4.2.4.REL...
  • FX_SKY
  • FX_SKY
  • 2016年01月05日 19:34
  • 2521

二、Quartz任务调度--集群

二、Quartz任务调度--集群 简介: (1)quartz定时任务调度,quartz最基本的概念就是job,在job内调用具体service完成具体功能,   quartz需要把每个job存储起...

Quartz学习笔记-Spring整合与简单使用

Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz 允许开发人员根据时间间隔来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与...

spring4和quartz2.x整合,对任务做动态操作(增删改查)

quartz 1.x版本和quartz2.x版本变化有点大,所以开始使用quartz时要注意版本 项目结构如下 本demo 的设计思想是对定时任务的增删改查等,需要通过相关的反射知识,及通过任务描...

Spring4整合Quartz2实现定时任务

Spring4整合Quartz2实现定时任务Quartz2可以实现非常复杂的定时任务,其时间表达式也是一个非常强大的功能,如在我们需要定义一个动态任务时,通过Quartz可以很容易就实现这种任务。本文...

Spring4.x整合Quartz2.x动态修改定时器时间(修正多定时器SpringBean异常)

Spring4.x整合Quartz2.x 动态修改定时器时间(修正多定时器SpringBean异常) 前不久在工作中遇到动态修改定时器的问题,在网上找了一些例子,大部分的写法都差不多,看完过后应用到...
  • KingWTD
  • KingWTD
  • 2015年08月16日 11:28
  • 7644
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring4+Quartz2计划任务集群
举报原因:
原因补充:

(最多只允许输入30个字)