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

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

Spring4+Quartz2集群动态创建任务

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

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

特别注意一点,与Spring3.1以下版本整合必须使用Quartz1,最初我拿2.2.1的,怎么搞都报错: Caused by: org.springframework.beans.factory.C...
  • l1028386804
  • l1028386804
  • 2015年10月15日 11:37
  • 9678

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

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

二、Quartz任务调度--集群

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

quartz与spring4整合的第一种方式

近日项目开发中需要执行一些定时任务,借此机会整理了一下定时任务的几种实现方式,由于项目采用spring框架,所以我都将结合spring框架来介绍。 分类从实现的技术上来分类,目前主要有三种技术 Jav...
  • zbw18297786698
  • zbw18297786698
  • 2017年06月19日 17:22
  • 1152

最新 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
  • 47784

Spring4.X整合quartz2.X的超简单配置

引入spring即spring-context-support相关依赖,还有quartz的依赖。 如果用xml配置定时器,可以这样: 是不是超级简单?还有更简单的,不需要配置文件,直接在方法上...
  • QQ245671051
  • QQ245671051
  • 2015年12月15日 17:33
  • 3327

Spring定时任务,Spring4整合quartz2.2,quartz-scheduler定时任务

一、首先加入spring(4.1.9.RELEASE)的依赖包,然后再加入quartz(2.2.1)的包,如下:   Xml代码   dependency>     g...
  • x6582026
  • x6582026
  • 2016年10月27日 17:28
  • 5822

spring4.x.x quartz计划任务

intellij idea新建maven工程 pom.xml加入spring和quartz的dependency dependency> groupId>org.quartz-sche...
  • wuxidemo
  • wuxidemo
  • 2017年05月04日 16:31
  • 294

Spring4整合quartz2.3,集群定时任务处理

概述 虽然单个Quartz实例能给予你很好的Job调度能力,但它不能满足典型的企业需求,如可伸缩性、高可靠性满足。假如你需要故障转移的能力并能运行日益增多的 Job,Quartz集群势必成为你应...
  • piyu8718
  • piyu8718
  • 2017年10月24日 15:40
  • 423
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring4+Quartz2计划任务集群
举报原因:
原因补充:

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