SSH中集成Quartz任务调度

我在用SSH框架写图书管理系统的时候,需要对借阅图书进行逾期的处理,我想到了使用Quartz任务调度,定时对借阅表的借阅时间和截止时间进行检查。所以需要对Quartz有一定的了解和如何在Spring中配置Quartz。

目前的版本已经是2.0以上,v2.x相对于v1.x有很多新特性出现,并有很多的改动,具体参见quartz官网上说明。这里介绍的仍然是v1.x(v1.7.3)。
spring所用的版本是spring2.5.5

这里写图片描述

applicationContext-quartz.xml的配置
这里写图片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
    <!-- task -->
    <!-- 定义了一个任务 -->
    <bean id="quartzClock" class="org.springframework.scheduling.quartz.JobDetailBean">
       <property name="jobClass">
        <value>com.sgfm.datacenter.sys.DataTimingTask</value><!-- 类的名字 有这个类完成具体的 任务 -->
       </property>
    </bean>


    <!-- 这种配置可以精确几点执行定时任务 -->
    <!-- 定义了任务的执行方式 -->
    <bean id="cronQuartzClock" class="org.springframework.scheduling.quartz.CronTriggerBean" >
       <property name="jobDetail">
        <ref bean="quartzClock"></ref>
       </property>

       <property name="cronExpression">
        <value>0/1 * * * * ? </value>
       </property>
    </bean>

    <!--第三步 启动定时任务,注意这里的ref bean -->
    <bean  id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
       <property name="triggers">
        <list>
         <ref bean="cronQuartzClock"></ref>
        </list>
       </property>
    </bean>

</beans>

执行的类
这里写图片描述

package com.sgfm.datacenter.sys;

import java.util.Date;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

public class DataTimingTask extends QuartzJobBean{
    public DataTimingTask() {
        super();
    }
    @Override
    protected void executeInternal(JobExecutionContext arg0)
            throws JobExecutionException {
        // TODO Auto-generated method stub
        System.out.println(new Date().toLocaleString());
    }
}

启动服务器后就可以看到结果了:
这里写图片描述

字段名   允许的值   允许的特殊字符
秒       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秒开始. 每个字段都有一系列可以开始或结束的数值。对于“秒”和“分”字段来说,其数值范围为059,对于“小时”字段来说其为023, 对于“日”字段来说为031, 而对于“月”字段来说为112"/"字段仅仅只是帮助你在允许的数值范围内从开始"第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 ? * *"         每天早上1015触发 
"0 15 10 * * ?"         每天早上1015触发 
"0 15 10 * * ? *"       每天早上1015触发 
"0 15 10 * * ? 2005"        2005年的每天早上1015触发 
"0 * 14 * * ?"      每天从下午2点开始到259分每分钟一次触发
"0 0/5 14 * * ?"        每天从下午2点开始到255分结束每5分钟一次触发
"0 0/5 14,18 * * ?"         每天的下午2点至2556点至655分两个时间段内每5分钟一次触发
"0 0-5 14 * * ?"        每天14:0014:05每分钟一次触发
"0 10,44 14 ? 3 WED"        三月的每周三的14101444触发
"0 15 10 ? * MON-FRI"       每个周一、周二、周三、周四、周五的1015触发
"0 15 10 15 * ?"        每月15号的1015触发
"0 15 10 L * ?"         每月的最后一天的1015触发
"0 15 10 ? * 6L"        每月最后一个周五的1015触发
"0 15 10 ? * 6L"        每月最后一个周五的1015触发
"0 15 10 ? * 6L 2002-2005"      2002年至2005年的每月最后一个周五的1015触发
"0 15 10 ? * 6#3"       每月的第三个周五的1015触发



"30 * * * * ?" 每半分钟触发任务
"30 10 * * * ?" 每小时的1030秒触发任务
"30 10 1 * * ?" 每天11030秒触发任务
"30 10 1 20 * ?" 每月2011030秒触发任务
"30 10 1 20 10 ? *" 每年102011030秒触发任务
"30 10 1 20 10 ? 2011" 2011102011030秒触发任务
"30 10 1 ? 10 * 2011" 201110月每天11030秒触发任务
"30 10 1 ? 10 SUN 2011" 201110月每周日11030秒触发任务
"15,30,45 * * * * ?"15秒,30秒,45秒时触发任务
"15-45 * * * * ?" 1545秒内,每秒都触发任务
"15/5 * * * * ?" 每分钟的每15秒开始触发,每隔5秒触发一次
"15-30/5 * * * * ?" 每分钟的15秒到30秒之间开始触发,每隔5秒触发一次
"0 0/3 * * * ?" 每小时的第00秒开始,每三分钟触发一次
"0 15 10 ? * MON-FRI" 星期一到星期五的10150秒触发任务
"0 15 10 L * ?" 每个月最后一天的10150秒触发任务
"0 15 10 LW * ?" 每个月最后一个工作日的10150秒触发任务
"0 15 10 ? * 5L" 每个月最后一个星期四的10150秒触发任务
"0 15 10 ? * 5#3" 每个月第三周的星期四的10150秒触发任务
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值