spring执行定时任务

定义一个任务是很简单的实现TimerTask的run方法就可以了.

 如下:

SayHelloTask.java

package test.timerTask;

import java.util.TimerTask;

public class SayHelloTask extends TimerTask {

  @Override

  public void run() {

    // TODO Auto-generated method stub

    System.out.println("测试TimerTask : Hello !!");

  }

}

然后是配置文件:

 <?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "spring-beans.dtd" >

<beans> 

<bean id="sayHelloTask" class="test.timerTask.SayHelloTask"></bean>

<bean id="scheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">

<property name="timerTask">

<ref bean="sayHelloTask"/>

</property> 

<!-- 任务执行周期 2m 关于一些任务的参数请参考JDK doc文档和Spring相关文档-->

<property name="period">

<value>2000</value>

</property>

<!-- 延时1m 执行任务 -->

<property name="delay"> 

<value>1000</value>

</property>

</bean>


 <!-- 启动定时器 -->

<bean id="timerBean" class="org.springframework.scheduling.timer.TimerFactoryBean">

<property name="scheduledTimerTasks">

<list>

<ref bean="scheduledTask"/>

</list>

</property>

</bean>

</beans>

测试类如下:

TestApp.java

package test.timerTask;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestApp {

  /**

   * @param args

   */

  public static void main(String[] args) {

    // TODO Auto-generated method stub

    ApplicationContext context = new ClassPathXmlApplicationContext("test/timerTask/javaTimer.xml");

 //   ApplicationContext context2 = new ClassPathXmlApplicationContext("test/timerTask/quartzTimer.xml");

  }

// 只要加载配置文件就可以了,

}

使用Java中的定时器比较简单,其提供的任务也比较简单, 下面来看看使用quartz来执行一个复杂的任务. 

首先制定一个任务, 实现QuartzJobBean中的方法.

package test.timerTask;

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;

import org.springframework.scheduling.quartz.QuartzJobBean;

public class SayHelloTaskUsingQuartz extends QuartzJobBean {

  @Override

  protected void executeInternal(JobExecutionContext context)

      throws JobExecutionException {

    // TODO Auto-generated method stub

    System.out.println("使用Quartz 认为调度: Hello!!");

  }

配置代码如下:

quartzTimer.xml

<?xml version="1.0" encoding="UTF-8"?> 

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "spring-beans.dtd" >

<beans>

            <bean id="sayHelloJob" class="org.springframework.scheduling.quartz.JobDetailBean">

                <property name="jobClass"> 

alue>test.timerTask.SayHelloTaskUsingQuartz</value>

</property>

</bean>

<!-- 关键在如下两个触发器的配置 -->

<!-- 类似于Java的简单触发器 -->

<bean id="helloTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">

<property name="jobDetail">

<ref bean="sayHelloJob"/>

</property>

<property name="startDelay">

<value>1000</value>

</property>

<property name="repeatInterval">

<value>3000</value>

</property>

</bean>

<!-- 复杂触发器 -->

<bean id="helloCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">

<property name="jobDetail">

<ref bean="sayHelloJob"/>

</property>

<property name="cronExpression">

<!-- 关键在配置此表达式 -->

<value>0 49 15 * * ?</value>

</property>

</bean>

<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

<property name="triggers">

<ref bean="helloCronTrigger"/>

</property>

</bean>

</beans>

关于简单触发器和复杂触发器,查考下面的解释:

Quartz设计者做了一个设计选择来从调度分离开作业。Quartz中的触发器用来告诉调度程序作业什么时候触发。框架提供了一把触发器类型,但两个最常用的是SimpleTrigger和CronTrigger。SimpleTrigger为需要简单打火调度而设计。典型地,如果你需要在给定的时间和重复次数或者两次打火之间等待的秒数打火一个作业,那么SimpleTrigger适合你。另一方面,如果你有许多复杂的作业调度,那么或许需要CronTrigger。

CronTrigger是基于Calendar-like调度的。当你需要在除星期六和星期天外的每天上午10点半执行作业时,那么应该使用CronTrigger。正如它的名字所暗示的那样,CronTrigger是基于Unix克隆表达式的。

作为一个例子,下面的Quartz克隆表达式将在星期一到星期五的每天上午10点15分执行一个作业。

0 15 10 ? * MON-FRI

下面的表达式

0 15 10 ? * 6L 2002-2005

将在2002年到2005年的每个月的最后一个星期五上午10点15分执行作业。

你不可能用SimpleTrigger来做这些事情。你可以用两者之中的任何一个,但哪个跟合适则取决于你的调度需要。


更多详细介绍参考此处:


关于cronExpression的介绍:

如上面的表达式所示: 

详细说明如下: 

The ?*? character is used to specify all values. For example, "*" in the minute field means "every minute".

“*”字符被用来指定所有的值。如:”*“在分钟的字段域里表示“每分钟”。

The ??? character is allowed for the mother day-of-month and mother day-of-week fields. It is used to specify ?no specific value?. This is useful when you need to specify something in one of the two fileds, but not the other. See the examples below for clarification.

“?”字符只在日期域和星期域中使用。它被用来指定“非明确的值”。当你需要通过在这两个域中的一个来指定一些东西的时候,它是有用的。看下面的例子你就会明白。

The ?-? character is used to specify ranges For example "10-12" in the hour field means "the hours 10, 11 and 12".

“-”字符被用来指定一个范围。如:“10-12”在小时域意味着“10点、11点、12点”。

The ?,? character is used to specify additional values. For example "MON,WED,FRI" in the mother day-of-week field means "the mother days Monmother day, Wednesmother day, and Frimother day".

“,”字符被用来指定另外的值。如:“MON,WED,FRI”在星期域里表示”星期一、星期三、星期五”.

附表:

"0 0 12 * * ?" 每天中午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期间的每1分钟触发 

"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发 

"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 

"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发 

"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2: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 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发 

"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发 


Quartz定时调度CronTrigger时间配置格式说明与实例 

分类: Spring2009-06-11 15:132363人阅读评论(0)收藏举报


1、 CronTrigger时间格式配置说明

CronTrigger配置格式:

格式: [秒] [分] [小时] [日] [月] [周] [年]

序号 说明 是否必填 允许填写的值 允许的通配符

1 0-59 , - * /

2 0-59 , - * /

3 小时 0-23 , - * /

4 1-31 , - * ? / L W

5 1-12 or JAN-DEC , - * /

6 1-7 or SUN-SAT , - * ? / L #

7 empty 或 1970-2099 , - * /

通配符说明:

* :表示所有值. 例如:在分的字段上设置 "*",表示每一分钟都会触发。

? :表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为"?" 具体设置为 0 0 0 10 * ?

- :表示区间。例如 在小时上设置 "10-12",表示 10,11,12点都会触发。

, :表示指定多个值,例如在周字段上设置 "MON,WED,FRI" 表示周一,周三和周五触发

/ :用于递增触发。如在秒上面设置"5/15" 表示从5秒开始,每增15秒触发(5,20,35,50)。 在月字段上设置'1/3'所示每月1号开始,每隔三天触发一次。

L :表示最后的意思。在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六,相当于"7"或"SAT"。如果在"L"前加上数字,则表示该数据的最后一个。

例如在周字段上设置"6L"这样的格式,则表示“本月最后一个星期五"

W :表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上设置"15W",表示离每月15号最近的那个工作日触发。如果15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五),则就在该天触发。如果指定格式为 "1W",它则表示每月1号往后最近的工作日触发。如果1号正是周六,则将在3号下周一触发。(注,"W"前只能设置具体的数字,不允许区间"-").

'L'和 'W'可以一组合使用。如果在日字段上设置"LW",则表示在本月的最后一个工作日触发

# :序号(表示每月的第几周星期几),例如在周字段上设置"6#3"表示在每月的第三个周星期六.注意如果指定"6#5",正好第五周没有星期六,则不会触发该配置(用在母亲节和父亲节再合适不过了)

周字段的设置,若使用英文字母是不区分大小写的 MON 与mon相同.

常用示例:

格式: [秒] [分] [小时] [日] [月] [周] [年]

0 0 12 * * ? 每天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点59分(整点开始,每隔5分触发) 

0 0/5 14,18 * * ? 每天下午的 18点到18点59分(整点开始,每隔5分触发)

0 0-5 14 * * ? 每天下午的 2点到2点05分每分触发 

0 10,44 14 ? 3 WED 3月分每周三下午的 2点10分和2点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 2002-2005 从2002年到2005年每月最后一周的星期五的10点15分触发

0 15 10 ? * 6#3 每月的第三周的星期五开始触发 

0 0 12 1/5 * ? 每月的第一个中午开始每隔5天触发一次 

0 11 11 11 11 ? 每年的11月11号 11点11分触发(光棍节)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值