【Quartz】Integration with Spring

Spring目前支持两种定时任务集成,Timer(since JDK1.3)和Quartz,这篇主要说说Quartz。

将Quartz集成到Spring主要是通过创建FactoryBean并为其添加一些引用。

而且我们可以通过MethodInvokingFactoryBeans非常方便的引用任何一个对象的方法。

首先需要理清Quartz本身的一些概念,Trigger、Job、JobDetail等等。

(请参考http://quartz-scheduler.org/documentation/quartz-2.2.x/tutorials)

为了简化其在Spring应用中的使用,Spring为用户提供了一些相关的class。

1.org.springframework.scheduling.quartz.JobDetailBean:

JobDetail对象拥有某个任务的所有信息。

相应地,Spring提供了JobDetailBean。

需要注意的是,JobDetailBean不适用于Quartz2.0以上的版本。

如果需要考虑兼容性,我们可以用JobDetailFactoryBean来代替。

顺便一提,我加的dependency是2.2.1的,我只能用JobDetailFactoryBean:

		<!-- quartz scheduler -->
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz</artifactId>
			<version>2.2.1</version>
		</dependency>
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz-jobs</artifactId>
			<version>2.2.1</version>
		</dependency>

下面是一个例子,定义一个job:

public class MinutePrintJob extends QuartzJobBean {

	@Override
	protected void executeInternal(JobExecutionContext context)
			throws JobExecutionException {
		logger.info("Current Time:::"+new Date());
	}

	static final Logger logger = LoggerFactory.getLogger(MinutePrintJob.class);
}

定义一个job bean:

	<bean id="printJob"
		class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
		<property name="jobClass" value="pac.king.schedule.MinutePrintJob" />
		<property name="durability" value="true" />
		<property name="jobDataAsMap">
			<map>
				<entry key="timeout" value="5" />
			</map>
		</property>
	</bean>

上面的例子中我们将timeout属性放到了jobDataAsMap中。(PS:JobDataMap对象可以在JobExecutionContext中获取)

另外JobDetailBean也可以将JobDataMap中的属性映射到某个Job对象的field中,即我们也可以在Job中得到这些属性。

(还是PS:别忘了setter)

比如以下代码,timeout输出5:

public class MinutePrintJob extends QuartzJobBean {

	private int timeout;
	public void setTimeout(int timeout) {
		this.timeout = timeout;
	}

	@Override
	protected void executeInternal(JobExecutionContext context)
			throws JobExecutionException {
		logger.info("Current Time:::"+new Date()+"\t timeout::"+timeout);
	}

	static final Logger logger = LoggerFactory.getLogger(MinutePrintJob.class);
}

2.org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean:

如果我想调用某个已定义的方法,但我又觉得再新建一个class写一行代码去调用这个方法很蠢。

此时我们可以用MethodInvokingJobDetailFactoryBean,仅仅改变一下配置就让它生效。

比如,我在MinutePrintJob中加了个...(当然他不是复写QuartzJobBean的方法..你可以把他定义在任何地方)

	public void justDoIt(){
		logger.info("Kim say:just do it!!");
	}

定义一个methodInvokingJobDetailFactoryBean....并根据需要让特定的trigger负责该job:

	<bean id="minPrintJob" class="pac.king.schedule.MinutePrintJob"></bean>
	<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject" ref="minPrintJob" />
		<property name="targetMethod" value="justDoIt" />
	</bean>

需要注意的是,默认时job都是无状态的,多个job可以影响彼此。

比如两个trigger引用了相同的JobDetail,并且在第一个job没有结束执行,第二个job就开始执行。

我们可以为JobDetail加个状态以让job不要并发执行。

MethodInvokingJobDetailFactoryBean的concurrent属性恰恰是解决这一问题的:

	<bean id="minPrintJob" class="pac.king.schedule.MinutePrintJob"></bean>
	<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject" ref="minPrintJob" />
		<property name="targetMethod" value="justDoIt" />
		<property name="concurrent" value="false" />
	</bean>

(PS:concurrent默认为true!)

3.CronTriggerBean and SimpleTriggerBean:

声明好job和jobDetail后,我们需要为他们安排时间执行。

虽然Quartz提供了一些trigger,Spring还额外提供了两个子类。

这两个类没有太多说明(两者javadoc的内容几乎相同),仅用于简化配置,使用方法如下:

<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
  <property name="jobDetail" ref="jobDetail"/>
  <property name="startDelay" value="5000"/>
  <property name="repeatInterval" value="15000"/>
</bean>
 
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
  <property name="jobDetail" ref="exampleJob"/>
  <property name="cronExpression" value="0 0 6 * * ?"/>
</bean>

(cronExpression格式请参考http://quartz-scheduler.org/api/2.1.0/org/quartz/CronExpression.html)

剩下的工作就是将这些trigger配置到SchedulerFactoryBean:

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  <property name="triggers">
    <list>
      <ref bean="cronTrigger"/>
      <ref bean="simpleTrigger"/>
    </list>
  </property>
</bean>

更多属性根据具体需求进行设置

另外,我用的是MySQL。

虽然可以在schedulerFactoryBean中配置dataSource,但我还是在quartz.properties中配置了数据源。

但这样就不能指定自己喜欢的Database Connection Pools实现,quartz默认用c3p0作为实现。

仅供参考:

#============================================================================ 
# Configure Datasources 
#============================================================================ 
org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8 
org.quartz.dataSource.myDS.user = root 
org.quartz.dataSource.myDS.password = 
org.quartz.dataSource.myDS.maxConnections = 5

【Quartz】Integration with Spring

时间: 2024-10-19 05:43:19

【Quartz】Integration with Spring的相关文章

【Quartz】基于Spring注解方式配置Quartz

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka         在上讲[Quartz]Spring3.2.9+Quqrtz2.2.1实现定时实例中,我们使用了XML的方式来配置Quartz定时任务,虽然比用API的方式简便多了,但是Spring还支持基本注解的方式来配置.这样做不仅更加简单,而且代码量也更加少了. 新建一个Java工程,导入要用到的包,Spring3.2.Quartz2.2.1.aopalliance-1.0.jar.co

【Quartz】Quartz存储与持久化-基于Spring的配置

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 在上文[Quartz]Quartz存储与持久化-基于quartz.properties的配置,是通过配置quartz.properties文件的方式来实现持久化的.本文将通过Spring配置的方式来实现存储与持久化. 1.同上文一样,要先创建相关的数据表,并新建一个JAVA工程,并导入相关的包,整个工程目录 如下: 2.创建Job类 package com.mucfc; import jav

【Quartz】将定时任务持久化到数据库

> 参考的优秀文章 Lesson 9: Job Stores > 用数据库存储定时任务信息 之前的文章所做的demo是将定时任务的信息保存在内存中的,见以下配置 org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore 如果用内存记录定时任务信息,应用重新启动后,定时任务信息将会丢失.比如,用户A通过系统设置1小时后执行Z操作,设置好后的,因系统重新启动,新启动的系统将会丢失“1小时后执行Z操作”的定时任务. 如果,我们需要在系统意外(或

【Quartz】Quartz存储与持久化-基于quartz.properties的配置

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.   Quartz存储与持久化 Quartz提供两种基本作业存储类型.第一种类型叫做RAMJobStore,第二种类型叫做JDBC作业存储.在默认情况下Quartz将任务调度的运行信息保存在内存中,这种方法提供了最佳的性能,因为内存中数据访问最快.不足之处是缺乏数据的持久性,当程序路途停止或系统崩溃时,所有运行的信息都会丢失. 比如我们希望安排一个执行100次的任务,如果执行到50次时系

【Quartz】Quartz的搭建、应用(单独使用Quartz)

阅读目录 > 参考的优秀资料 > 版本说明 > 简单的搭建 > 在Web应用中使用Quartz > 常用的Cron Schedule Quartz在Java构建的系统中,是十分常用的定时任务框架. 本文,记录.介绍Quartz的简单入门的单独搭建(此文入门学习Quartz为主,并非基于Spring托管形式). > 参考的优秀资料 Quartz Quick Start Guide Chapter 3: Logback configuration > 版本说明 除了Q

【Quartz】Quartz的简单搭建

Quartz在Java构建的系统中,是十分常用的定时任务框架. 本文,记录.介绍Quartz的简单入门的单独搭建(此文入门学习Quartz为主,并非基于Spring托管形式). > 参考的优秀资料 Quartz Quick Start Guide Chapter 3: Logback configuration > 版本说明 除了Quartz,还引入logback(为了看详细的日志嘛!) <dependencies> <dependency> <groupId&g

【quartz】 入门-配置文件

quartz 启动 NameValueCollection props = (NameValueCollection)ConfigurationManager.GetSection("quartz"); //PropertiesParser cfg = new PropertiesParser(props); ISchedulerFactory sf = new StdSchedulerFactory(props); IScheduler sched = sf.GetScheduler

【Quartz】 JobListener、Triggerlistener、SchedulerListener介绍与使用

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.Quartz 监听器 在某个所关注事件发生时,监听器提供了一种方便且非侵入性的机制来获得这一通知.Quartz 提供了三种类型的监听器:监听 Job 的,监听 Trigger 的,和监听 Scheduler 自已的.本章解释如何应用每一种类型来更好的管理你的 Quartz 应用,并获悉到什么事件正在发生. 1.1.监听器作为扩展点术语 "扩展点" 在软件开发中用于指示框架或应用

【Activiti】activiti与spring的集成

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org