`
flashdream8
  • 浏览: 678716 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在Spring中使用Quartz调度器

阅读更多

关键字: java, spring

Quartz调度器为调度工作提供了更丰富的支持。和Java定时器一样,可以使用Quartz来每隔多少毫秒执行一个工作。但Quartz比Java Timer更先进之处在于它允许你调度一个工作在某个特定的时间或日期执行。
关于Quartz的更多信息,可以访问Quartz位于http://www.opensymphony.com/quartz的主页。
让我们从定义发送报表邮件的工作开始使用Quartz:

创建一个工作
定义Quartz工作的第一步是创建一个类来定义工作。要做到这一点,你需要从Spring的QuartzJobBean中派生子类,如以下程序所示:

程序:定义一个Quartz工作
 
public class EmailReportJob extends QuartzJobBean {
	public EmailReportJob() {}

	protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
       courseService.sendCourseEnrollmentReport(); 

    }

	private CourseService courseService;
    public void setCourseService(CourseService courseService) {
		this.courseService = courseService;
    }
}

QuartzJobBean是Quartz中与Java的TimerTask等价的类。它实现了org.quartz.Job接口。executeInternal()方法定义了当预定的时刻来临时应该执行哪些动作。在这里,正如EmailReportTask,你只是简单地调用了courseService属性的sendCourseEnrollmentReport()方法。

在Spring配置文件中按以下方式声明这个工作:
 
<bean id="reportJob" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass">
        <value>com.springinaction.training.schedule.EmailReportJob</value>
    </property>
    <property name="jobDataAsMap">
       <map>
           <entry key="courseService">
               <ref bean="courseService"/>
           </entry>
       </map>
    </property>
</bean>

值得注意的是,在这里你并没有直接声明一个EmailReportJob Bean,而是声明了一个JobDetailBean。这是使用Quartz时的一个特点。JobDetailBean是Quartz的org.quartz.JobDetail的子类,它要求通过jobClass属性来设置一个Job对象。

使用Quartz的JobDetail中的另一个特别之处是EmailReportJob的courseService属性是间接设置的。JobDetail的jobDataAsMap属性接受一个java.util.Map,其中包含了需要设置给jobClass的各种属性。在这里,这个map包含了一个指向courseService Bean的引用,它的键值为courseService。当JobDetailBean实例化时,它会将courseService Bean注入到EmailReportJob的courseService属性中。


调度工作
现在工作已经被定义好了,接下来你需要调度这个工作。Quartz的org.quartz.Trigger类描述了何时及以怎样的频度运行一个Quartz工作。Spring提供了两个触发器,SimpleTriggerBean和CronTriggerBean。你应该使用哪个触发器?让我们分别考察一下这两个触发器,首先从SimpleTriggerBean开始。

SimpleTriggerBean与ScheduledTimerTask类似。你可以用它来指定一个工作应该以怎样的频度运行,以及(可选地)在第一次运行工作之前应该等待多久。例如,要调度报表工作每24小时运行一次,第一次在1小时之后开始运行,可以按照以下方式进行声明:
 
<bean id="simpleReportTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
    <property name="jobDetail">
        <ref bean="reportJob"/>
    </property>
    <property name="startDelay">
        <value>3600000</value>
    </property>
    <property name="repeatInterval">
        <value>86400000</value>
    </property>
</bean>

属性jobDetail装配了将要被调度的工作,在这个例子中是reportJob Bean。属性repeatInterval告诉触发器以怎样的频度运行这个工作(以毫秒作为单位)。这里,我们设置它为86400000,因此每隔24小时它会被触发一次。你也可以选择设置startDelay属性来延迟工作的第一次执行。我们设置它为3600000,因此在第一次触发之前它会等待1小时。

调度一个cron工作
尽管你可能认为SimpleTriggerBean适用于大多数应用,但它仍然不能满足发送注册报表邮件的需求。正如ScheduledTimerTask,你只能指定工作执行的频度,而不能准确指定它于何时运行。因此,你无法使用SimpleTriggerBean在每天早晨6:00给课程主任发送注册报表邮件。

然而,CronTriggerBean允许你更精确地控制任务的运行时间。如果你对Unix的cron工具很熟悉,则会觉得CronTriggerBean很亲切。你不是定义工作的执行频度,而是指定工作的准确运行时间(和日期)。例如,要在每天早上6:00运行报表工作,可以按照以下方式声明一个CronTriggerBean:
 
<bean id="cronReportTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail">
        <ref bean="reportJob"/>
    </property>
    <property name="cronExpression">
        <value>0 0 6 * * ?</value>
    </property>
</bean>


和SimpleTriggerBean一样,jobDetail属性告诉触发器调度哪个工作。这里我们又一次装配了一个reportJob Bean。属性cronExpression告诉触发器何时触发。如果你不熟悉cron,这个属性可能看上去有点神秘,因此让我们进一步考察一下这个属性。

一个cron表达式有至少6个(也可能是7个)由空格分隔的时间元素。从左至右,这些元素的定义如下:

1.秒(0–59)

2.分钟(0–59)

3.小时(0–23)

4.月份中的日期(1–31)

5.月份(1–12或JAN–DEC)

6.星期中的日期(1–7或SUN–SAT)

7.年份(1970–2099)

每一个元素都可以显式地规定一个值(如6),一个区间(如9-12),一个列表(如9,11,13)或一个通配符(如*)。“月份中的日期”和“星期中的日期”这两个元素是互斥的,因此应该通过设置一个问号(?)来表明你不想设置的那个字段。表7.1中显示了一些cron表达式的例子和它们的意义:

表:一些cron表达式的例子

表   达   式                    意     义

0 0 10,14,16 * * ?                     每天上午10点,下午2点和下午4点
0 0,15,30,45 * 1-10 * ?                每月前10天每隔15分钟
30 0 0 1 1 ? 2012                      在2012年1月1日午夜过30秒时
0 0 8-5 ? * MON-FRI                    每个工作日的工作时间

对于cronReportTrigger,我们设置cronExpression为0 0 6 * * ?可以把它读作“在任何月份任何日期(不管是星期几)的6时0分0秒执行触发器。”换句话说,这个触发器会在每天早晨6:00执行。
使用CronTriggerBean完全能够满足课程主任的期望了。现在剩下要做的只是启动这个工作了。


启动工作
Spring的SchedulerFactoryBean是Quartz中与TimerFactoryBean等价的类。按照如下方式在Spring配置文件中声明它:
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="cronReportTrigger"/>
         </list>
    </property>
</bean>

属性triggers接受一组触发器。由于目前只有一个触发器,因此只需简单地装配一个包含cronReportTrigger Bean的一个引用的列表即可。

现在,你已经实现了调度发送注册报表邮件的需求。但在这个过程中,你做了一些额外的工作。在开始新的话题之前,首先让我们看一下如何通过更简单一些的方式调度报表邮件。
<转自:http://ispring.iteye.com/blog/157124> 作者:

ispring

 

//======================================================================

 

一个Cron-表达式是一个由六至七个字段组成由空格分隔的字符串,其中6个字段是必须的而一个是可选的,如下:
字段名     允许的值     允许的特殊字符 
秒     0-59     , - * / 
分     0-59     , - * / 
小时     0-23     , - * / 
日     1-31     , - * ? / L W C 
月     1-12 or JAN-DEC     , - * / 
周几     1-7 or SUN-SAT     , - * ? / L C # 
年 (可选字段)     empty, 1970-2099     , - * /


'*' 字符可以用于所有字段,在“分”字段中设为"*"表示"每一分钟"的含义。

'?' 字符可以用在“日”和“周几”字段. 它用来指定 '不明确的值'. 这在你需要指定这两个字段中的某一个值而不是另外一个的时候会被用到。在后面的例子中可以看到其含义。

'-' 字符被用来指定一个值的范围,比如在“小时”字段中设为"10-12"表示"10点到12点".

',' 字符指定数个值。比如在“周几”字段中设为"MON,WED,FRI"表示"the days Monday, Wednesday, and Friday".

'/' 字符用来指定一个值的的增加幅度. 比如在“秒”字段中设置为"0/15"表示"第0, 15, 30, 和 45秒"。而 "5/15"则表示"第5, 20, 35, 和 50". 在'/'前加"*"字符相当于指定从0秒开始. 每个字段都有一系列可以开始或结束的数值。对于“秒”和“分”字段来说,其数值范围为0到59,对于“小时”字段来说其为0到23, 对于“日”字段来说为0到31, 而对于“月”字段来说为1到12。"/"字段仅仅只是帮助你在允许的数值范围内从开始"第n"的值。 因此 对于“月”字段来说"7/6"只是表示7月被开启而不是“每六个月”, 请注意其中微妙的差别。

'L'字符可用在“日”和“周几”这两个字段。它是"last"的缩写, 但是在这两个字段中有不同的含义。例如,“日”字段中的"L"表示"一个月中的最后一天" —— 对于一月就是31号对于二月来说就是28号(非闰年)。而在“周几”字段中, 它简单的表示"7" or "SAT",但是如果在“周几”字段中使用时跟在某个数字之后, 它表示"该月最后一个星期×" —— 比如"6L"表示"该月最后一个周五"。当使用'L'选项时,指定确定的列表或者范围非常重要,否则你会被结果搞糊涂的。

'W' 可用于“日”字段。用来指定历给定日期最近的工作日(周一到周五) 。比如你将“日”字段设为"15W",意为: "离该月15号最近的工作日"。因此如果15号为周六,触发器会在14号即周五调用。如果15号为周日, 触发器会在16号也就是周一触发。如果15号为周二,那么当天就会触发。然而如果你将“日”字段设为"1W", 而一号又是周六, 触发器会于下周一也就是当月的3号触发,因为它不会越过当月的值的范围边界。'W'字符只能用于“日”字段的值为单独的一天而不是一系列值的时候。

'L'和'W'可以组合用于“日”字段表示为'LW',意为"该月最后一个工作日"。

'#' 字符可用于“周几”字段。该字符表示“该月第几个周×”,比如"6#3"表示该月第三个周五( 6表示周五而"#3"该月第三个)。再比如: "2#1" = 表示该月第一个周一而 "4#5" = 该月第五个周三。注意如果你指定"#5"该月没有第五个“周×”,该月是不会触发的。

'C' 字符可用于“日”和“周几”字段,它是"calendar"的缩写。 它表示为基于相关的日历所计算出的值(如果有的话)。如果没有关联的日历, 那它等同于包含全部日历。“日”字段值为"5C"表示"日历中的第一天或者5号以后",“周几”字段值为"1C"则表示"日历中的第一天或者周日以后"。

对于“月份”字段和“周几”字段来说合法的字符都不是大小写敏感的。

下面是一些完整的例子:
表达式     含义 
"0 0 12 * * ?"     每天中午十二点触发 
"0 15 10 ? * *"     每天早上10:15触发 
"0 15 10 * * ?"     每天早上10:15触发 
"0 15 10 * * ? *"     每天早上10:15触发 
"0 15 10 * * ? 2005"     2005年的每天早上10:15触发 
"0 * 14 * * ?"     每天从下午2点开始到2点59分每分钟一次触发 
"0 0/5 14 * * ?"     每天从下午2点开始到2:55分结束每5分钟一次触发 
"0 0/5 14,18 * * ?"     每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发 
"0 0-5 14 * * ?"     每天14:00至14:05每分钟一次触发 
"0 10,44 14 ? 3 WED"     三月的每周三的14:10和14:44触发 
"0 15 10 ? * MON-FRI"     每个周一、周二、周三、周四、周五的10:15触发 
"0 15 10 15 * ?"     每月15号的10:15触发 
"0 15 10 L * ?"     每月的最后一天的10:15触发 
"0 15 10 ? * 6L"     每月最后一个周五的10:15触发 
"0 15 10 ? * 6L"     每月最后一个周五的10:15触发 
"0 15 10 ? * 6L 2002-2005"     2002年至2005年的每月最后一个周五的10:15触发 
"0 15 10 ? * 6#3"     每月的第三个周五的10:15触发
http://chorpin.iteye.com/blog/157992

分享到:
评论

相关推荐

    Spring中Quartz调度器的使用

    Spring 中 Quartz 调度器的使用是指在 Spring 框架中使用 Quartz 调度器来实现任务调度。Quartz 是一个功能强大且灵活的开源任务调度器,能够满足复杂的任务调度需求。在 Spring 中使用 Quartz 调度器可以将任务调度...

    Spring中Quartz调度器的使用 示例代码

    在Spring框架中集成Quartz调度器,可以实现定时任务的高效管理。Quartz是一个开源的作业调度框架,它允许程序创建、调度和执行任务。在本示例中,我们将探讨如何在Spring应用中配置和使用Quartz,以及通过示例代码来...

    spring任务调度(Quartz )

    首先,要在Spring中使用Quartz,你需要将`quartz-all-1.5.2.jar`等相关的Quartz库添加到项目的类路径中。这个库包含了Quartz所需的所有组件,使你可以方便地创建和管理定时任务。 在配置文件中,我们通常会创建一个...

    Spring Quartz 调度器

    下面我们将详细讲解如何在Spring中配置和使用Quartz调度器。 首先,我们需要在项目中引入Quartz和Spring的相关依赖。在pom.xml文件中添加对应的Maven坐标,确保能正确导入Quartz和Spring的库。 接下来,我们需要...

    Spring中的Quartz配置-Spring-定时器-java定时器.doc

    在 Spring 框架中,Quartz 是一个非常流行的开源作业调度器,可以实现任务的定时执行。在本篇文章中,我们将讨论如何在 Spring 中配置 Quartz,以实现 Java 定时器的功能。 Quartz 介绍 Quartz 是一个开源的作业...

    spring2与quartz在Web整合

    通过理解和掌握这些知识点,开发者能够有效地在 Spring 2 和 Quartz 之间建立桥梁,实现 Web 应用中的复杂任务调度功能。对于出现问题的整合,开发者可以通过分析源码、查看日志和调试来定位和解决问题,进一步提升...

    spring+quartz任务调度代码版

    通过对这些文件的深入学习和理解,你可以掌握如何在Spring环境中配置和使用Quartz进行任务调度,这对于构建有定时任务需求的应用程序非常有帮助。这个项目提供了实践经验,有助于开发者提升在企业级应用开发中的技能...

    Spring下使用Quartz任务调度

    这篇博客“Spring下使用Quartz任务调度”将深入探讨如何在Spring环境中集成并使用Quartz进行任务管理。 Quartz是一个开源的作业调度框架,它可以被用来创建、调度和执行任务,支持复杂的调度策略。其核心特性包括可...

    Spring整合任务调度框架Quartz

    这种方式非常简单,开发者只需要在 Spring 配置文件中定义相应的 Bean,就可以使用 Quartz 实现任务调度。 以下是一个简单的示例代码: ```xml &lt;bean id="overdueRecall" class="com.sursen.souba.ddlibserve....

    Spring中Quartz任务调度器cronexpression配置说明

    ### Spring中Quartz任务调度器cronexpression配置说明 在现代软件开发中,特别是Java应用程序领域,定时任务的执行是常见的需求之一。Spring框架通过集成Quartz这一强大的任务调度库,为开发者提供了灵活、高效的...

    quartz3种调度形式+传参.zip

    二、Spring + Quartz调度 当Quartz与Spring框架结合使用时,可以充分利用Spring的依赖注入和管理特性,简化任务的配置和管理。Spring提供了一个`org.springframework.scheduling.quartz.SchedulerFactoryBean`,...

    Spring集成Quartz调度框架.pdf

    5. **启动调度器**:在Spring容器初始化时启动Quartz调度器,使其开始监听触发器并调度作业的执行。 #### 五、示例:使用Spring集成Quartz实现定时任务 以下是一个简单的示例,展示如何使用Spring集成Quartz来实现...

    SpringQuartz的使用文档

    SpringQuartz是一个强大的任务调度框架,它在Java应用程序中用于自动化执行特定任务,如定时生成文件、统计数据或执行后台清理工作。Quartz是开源的,具有高度灵活的调度功能,能够根据预定义的时间表触发任务,同时...

    spring quartz 任务调度

    在Spring中使用Quartz,我们需要引入quartz和spring-quartz依赖,并在Spring配置文件中进行相应的配置。 创建一个Spring Quartz的Demo通常包含以下步骤: 1. 引入依赖:在项目中添加Quartz和Spring对Quartz支持的...

    Spring quartz定时调度jar包

    首先,你需要在Spring的配置文件中声明一个`SchedulerFactoryBean`,这将初始化并管理Quartz调度器。然后,你可以定义`JobDetail`和`Trigger`,`JobDetail`代表你要执行的任务,而`Trigger`定义了任务的执行时机。...

    Spring调度器Quartz笔记

    Spring 提供了对 Quartz 的集成,使得在 Spring 应用中使用 Quartz 更加方便。 1. **Quartz 简介**:Quartz 不仅仅是一个简单的定时任务库,它提供了一整套的调度服务,包括作业(Job)、触发器(Trigger)、计划器...

    Spring Quartz 调度器的使用,定时任务[含例子]

    Spring Quartz 是一个强大的开源任务调度框架,用于在Java应用程序中执行定时任务。它与Spring框架无缝集成,使得在Spring应用中配置和管理定时任务变得非常简单。Quartz 的设计允许开发者灵活地创建、管理和执行...

    spring3整合quartz1.8和spring3整合quartz2.2两个版本示例

    5. **监听器**:Quartz 2.x 提供了更丰富的监听器功能,可以在 Spring 配置中添加 JobListener 和 TriggerListener。 6. **Cron 表达式**:在定义 Trigger 时,可以使用更灵活的 Cron 表达式,如 `@Scheduled(cron ...

    Spring中使用Quartz(二)

    本篇将深入探讨如何在Spring项目中使用Quartz,以及与TimerTask的区别。 1. **TimerTask vs Quartz** - **TimerTask**: 是Java标准库中的一个类,适用于简单定时任务的执行。它使用单线程模型,如果一个任务执行...

    关于spring中quartz的配置

    在Spring框架中集成Quartz是一款常见的任务调度解决方案,它允许开发者在应用中...通过以上步骤,你就可以在Spring中成功配置并使用Quartz进行任务调度了。注意,实际应用中还需要根据具体需求调整配置和Job的实现。

Global site tag (gtag.js) - Google Analytics