第 18 章 使用Quartz或Timer完成时序调度工作

18.1. 简介

Spring提供了支持时序调度(译者注:Scheduling,下同)的整合类.现在, Spring支持内置于1.3版本以来的JDK中的Timer和Quartz Scheduler(http://www.quartzscheduler.org)。 两个时序调度器通过FactoryBean建立,保持着可选的对Timers或者Triggers的引用。更进一步的, 对于Quartz Scheduler和Timer两者存在一个方便的类允许你调用目标对象(类似于通常的MethodInvokingFactoryBeans)上的某个方法

18.2. 使用OpenSymphony Quartz Scheduler

Quartz使用Triggers,JobsJobDetail来实现时序调度中的各种工作。 为了了解Quartz背后的种种基本观点,你可以移步至http://www.opensymphony.com/quartz。 为了方便的使用,Spring提供了几个类在基于Spring的应用中来简化对Quartz的使用。

18.2.1. 使用JobDetailBean

JobDetail 对象包括了运行一个job所需要的所有信息。 于是Spring提供了一个所谓的JobDetailBean使得JobDetail拥有了一个真实的,有意义的默认值。让我们来看个例子:

<bean name="exampleJob" class="org.springframework.scheduling.quartz.JobDetailBean"><property name="jobClass"><value>example.ExampleJob</value></property><property name="jobDataAsMap"><map><entry key="timeout"><value>5</value></entry></map></property>
</bean>

Job detail bean拥有所有运行job(ExampleJob)的必要信息。通过job的data map来制定timeout。 Job的data map可以通过JobExecutionContext(在运行时刻传递给你)来得到, 但是JobDetailBean也把从job的data map中得到的属性映射到实际job中的属性中去。 所以,如果ExampleJob中包含一个名为timeout的属性,JobDetailBean将自动为它赋值:

package example;public class ExampleJob extends QuartzJobBean {private int timeout;/*** Setter called after the ExampleJob is instantiated* with the value from the JobDetailBean (5)*/ public void setTimeout(int timeout) {this.timeout = timeout;}protected void executeInternal(JobExecutionContext ctx)throws JobExecutionException {// do the actual work}
}

所有Job detail bean中的一些其他的设定对你来说也是可以同样设置的.

注意:使用namegroup属性,你可以修改job在哪一个组下运行和使用什么名称。 默认情况下,job的名称等于job detai bean的名称(在上面的例子中为exampleJob)。

18.2.2. 使用MethodInvokingJobDetailFactoryBean

通常情况下,你只需要调用特定对象上的一个方法。你可以使用MethodInvokingJobDetailFactoryBean准确的做到这一点:

<bean id="methodInvokingJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject"><ref bean="exampleBusinessObject"/></property><property name="targetMethod"><value>doIt</value></property>
</bean>

上面例子将导致exampleBusinessObject中的doIt方法被调用(如下):

public class BusinessObject {// properties and collaboratorspublic void doIt() {// do the actual work}
}
<bean id="exampleBusinessObject" class="examples.ExampleBusinessObject"/>

使用MethodInvokingJobDetailFactoryBean你不需要创建只有一行代码且只调用一个方法的job, 你只需要创建真实的业务对象来包装具体的细节的对象。

默认情况下,Quartz Jobs是无状态的,可能导致jobs之间互相的影响。如果你为相同的JobDetail指定两个触发器, 很可能当第一个job完成之前,第二个job就开始了。如果JobDetail对象实现了Stateful接口,就不会发生这样的事情。 第二个job将不会在第一个job完成之前开始。为了使得jobs不并发运行,设置MethodInvokingJobDetailFactoryBean中的concurrent标记为false

<bean id="methodInvokingJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject"><ref bean="exampleBusinessObject"/></property><property name="targetMethod"><value>doIt</value></property>
</bean>           

注意:默认情况下,jobs在并行的方式下运行。

18.2.3. 使用triggers和SchedulerFactoryBean来包装任务

我们已经创建了job details,jobs。我们回顾了允许你调用特定对象上某一个方法的便捷的bean。 当然我们仍需要调度这些jobs。这需要使用triggers和SchedulerFactoryBean来完成。 Quartz自带一些可供使用的triggers。Spring提供两个子类triggers,分别为CronTriggerBeanSimpleTriggerBean

Triggers也需要被调度。Spring提供SchedulerFactoryBean来暴露一些属性来设置triggers。SchedulerFactoryBean负责调度那些实际的triggers。

两个例子:

<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"><property name="jobDetail"><!-- see the example of method invoking job above -->    <ref bean="methodInvokingJobDetail"/></property><property name="startDelay"><!-- 10 seconds --><value>10000</value></property><property name="repeatInterval"><!-- repeat every 50 seconds --><value>50000</value></property>
</bean><bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"><property name="jobDetail"><ref bean="exampleJob"/></property><property name="cronExpression"><!-- run every morning at 6 am --><value>0 6 * * 1</value></property>
</bean>

现在我们创建了两个triggers,其中一个开始延迟10秒以后每50秒运行一次,另一个每天早上6点钟运行。 我们需要创建一个SchedulerFactoryBean来最终实现上述的一切:

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

更多的一些属性你可以通过SchedulerFactoryBean来设置,例如job details使用的Calendars,用来订制Quartz的一些属性以及其它。 你可以看相应的JavaDOC(http://www.springframework.org/docs/api/org/springframework/scheduling/quartz/SchedulerFactoryBean.html)来了解进一步的信息。

18.3. 使用JDK Timer支持类

另外一个调度任务的途径是使用JDK Timer对象。更多的关于Timers的信息可以在这里http://java.sun.com/docs/books/tutorial/essential/threads/timer.html找到。 上面讨论的概念仍可以应用于Timer的支持。你可以创建定制的timer或者调用某些方法的timer。 包装timers的工作由TimerFactoryBean完成。

18.3.1. 创建定制的timers

你可以使用TimerTask创建定制的timer tasks,类似于Quartz中的jobs:

public class CheckEmailAddresses extends TimerTask {private List emailAddresses;public void setEmailAddresses(List emailAddresses) {this.emailAddresses = emailAddresses;}public void run() {// iterate over all email addresses and archive them}
}

包装它是简单的:

<bean id="checkEmail" class="examples.CheckEmailAddress"><property name="emailAddresses"><list><value>test@springframework.org</value><value>foo@bar.com</value><value>john@doe.net</value></list></property>
</bean><bean id="scheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"><!-- wait 10 seconds before starting repeated execution --><property name="delay"><value>10000</value></property><!-- run every 50 seconds --><property name="period"><value>50000</value></property><property name="timerTask"><ref local="checkEmail"/></property>
</bean>

18.3.2. 使用MethodInvokingTimerTaskFactoryBean

就像Quartz的支持一样,Timer的支持也有一个组件允许你周期性地调用一个方法:

<bean id="methodInvokingTask" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean"><property name="targetObject"><ref bean="exampleBusinessObject"/></property><property name="targetMethod"><value>doIt</value></property>
</bean>

上面的例子将会导致exampleBusinessObject上的doIt方法被调用(如下):

public class BusinessObject {// properties and collaboratorspublic void doIt() {// do the actual work}
}

把上面例子中提到ScheduledTimerTask的引用改为methodInvokingTask将导致该task被执行。

18.3.3. 包装:使用TimerFactoryBean来建立tasks

TimerFactoryBean类似于QuartzSchedulerFactoryBean,都是服务于一个目的:建立起实际的时序调度。 TimerFactoryBean建立一个实际的Timer来调度它引用的那些tasks。你可以指定它是否使用一个守护线程。

<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean"><property name="scheduledTimerTasks"><list><!-- see the example above --><ref local="scheduledTask"/></list></property>
</bean>

就是这些了!

from: http://docs.huihoo.com/spring/zh-cn/scheduling.html

Spring - Java/J2EE Application Framework 应用框架 第 18 章 使用Quartz或Timer完成时序调度工作相关推荐

  1. Spring - Java/J2EE Application Framework 应用框架 第 5 章 Spring AOP: Spring之面向方面编程G

    第 5 章 Spring AOP: Spring之面向方面编程 5.1. 概念 面向方面编程 (AOP) 提供从另一个角度来考虑程序结构以完善面向对象编程(OOP). 面向对象将应用程序分解成 各个层 ...

  2. Spring - Java/J2EE Application Framework 应用框架 第 5 章 Spring AOP: Spring之面向方面编程

    第 5 章 Spring AOP: Spring之面向方面编程 5.1. 概念 面向方面编程 (AOP) 提供从另一个角度来考虑程序结构以完善面向对象编程(OOP). 面向对象将应用程序分解成 各个层 ...

  3. Spring - Java/J2EE Application Framework 应用框架 第 8 章 源代码级的元数据支持

    第 8 章 源代码级的元数据支持 8.1. 源代码级的元数据 源代码级的元数据是对程序元素:通常为类和/或方法的 attribute 或者叫annotation的扩充. 举例来说,我们可以象下面一样给 ...

  4. Spring - Java/J2EE Application Framework 应用框架 第 7 章 事务管理

    第 7 章 事务管理 7.1. Spring事务抽象 Spring提供了一致的事务管理抽象.这个抽象是Spring最重要的抽象之一, 它有如下的优点: 为不同的事务API提供一致的编程模型,如JTA. ...

  5. Spring - Java/J2EE Application Framework 应用框架 第 13 章 集成表现层

    第 13 章 集成表现层 13.1. 简介 Spring之所以出色的一个原因就是将表现层从MVC的框架中分离出来.例如,通过配置就可以让Velocity或者XSLT来代替已经存在的JSP页面.本章介绍 ...

  6. Spring - Java/J2EE Application Framework 应用框架 第 11 章 使用ORM工具进行数据访问

    第 11 章 使用ORM工具进行数据访问 11.1. 简介 Spring在资源管理,DAO实现支持以及实物策略等方面提供了与Hibernate, JDO和iBATIS SQL映射的集成. 对Hiber ...

  7. Spring - Java/J2EE Application Framework 应用框架 第 10 章 使用JDBC进行数据访问

    第 10 章 使用JDBC进行数据访问 10.1. 简介 Spring提供的JDBC抽象框架由core, datasource,object和support四个不同的包组成. 就和它名字的暗示一样,o ...

  8. Spring - Java/J2EE Application Framework 应用框架 第 14 章 JMS支持

    第 14 章 JMS支持 14.1. 介绍 Spring提供一个用于简化JMS API使用的抽象层框架,并且对用户屏蔽JMS API中从1.0.2到1.1版本之间的不同. JMS大体上被分为两个功能块 ...

  9. Spring - Java/J2EE Application Framework 应用框架 第 3 章 Beans, BeanFactory和ApplicationContext

    第 3 章 Beans, BeanFactory和ApplicationContext 3.1. 简介 在Spring中,两个最基本最重要的包是 org.springframework.beans 和 ...

最新文章

  1. CentOS上安装 jdk
  2. AG3 hang after click membership search
  3. mes实施顾问前景如何_国匠智能制造培训|MES的两种实施顾问类型
  4. 华为120hz鸿蒙系统,华为亮剑,120Hz+鸿蒙系统+5500mAh,竟然如此销魂
  5. linux bash环境变量,linux-bash环境变量
  6. java 定时任务哪个好_java目前常用的几种定时任务
  7. Linux中脚本的使用方法
  8. Docker存储驱动之总览
  9. Linux定时任务-定时锁屏
  10. Apache Project LIst 所有项目介绍
  11. 【认识AI:人工智能如何赋能商业】【08】通用人工智能应用—智能机器人
  12. pdf转json_如何显著缩小PDF文件大小?
  13. 关于“u盘打开为空,但是占用空间”的解决方法之一
  14. OCR中文文字识别软件
  15. PostOffice
  16. Linux磁盘故障和文件系统修复(救援模式Centos7、Centos8)
  17. WOW平衡性设计理念
  18. 原创 | 既生synchronized,何生volatile?!
  19. 正则表达式(一)认识正则表达式
  20. 联想笔记本安装PHP环境,联想笔记本装系统步骤 教你如何正确安装笔记本系统...

热门文章

  1. 清除WebLogic8.1缓存
  2. Vue.js组件化开发实践
  3. 贝叶斯推断及其互联网应用(一):定理简介
  4. 从0到1建立一张评分卡之模型建立
  5. C语言文件读写(4)-判断文件是否结束
  6. 深入理解分布式技术 - Kafka 高性能原理剖析
  7. Spring-使用加密的属性文件02
  8. 计算机语言学习app,学习之编程语言
  9. 三角窗 matlab,【matlab】矩形窗/三角窗/hanning窗/hamming窗/blackman窗的頻率響應圖
  10. 学习笔记Hadoop(一)—— Hadoop介绍(1)——认识大数据