Spring时间调度

Java的Timer类和OpenSymphony的Quartz调度器是两个流行的调度API。Spring为这两个调度器提供了一个抽象层,可以更容易的使用他们


spring+timer

1 .使用java Timer调度任务
第一步 web.xml
<!--*********************** spring setting ***********************-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/classes/applicationContextTimeTask.xml
        </param-value>
    </context-param>

第二步  配置applicationContextTimeTask.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>

<!--
****************使用java Timer调度任务*********************
使用java Timer调度第一步是从java.util.TimerTask派生一个任务声明本身只是将EmailReportTask放到应用上下文,并在testBean属性装配TestBean在调度之前不会做任何事。
-->
<bean id="testBean" class="com.photo.test.TestBean"/>
<bean id="reportTimerTask" class="com.photo.task.EmailReportTask">
      <property name="testBean">
            <ref bean="testBean"/>
      </property>
</bean>

<!--
Spring的ScheduledTimerTimerTask定义了一个定时器任务的运行周期。应该如下装配一个ScheduledTimerTasktimerTask告诉ScheduledTimerTask运行哪个TimerTask,这里该装配属性指向reportTimerTask的一个引用。属性period告诉ScheduledTimerTask以怎样的频率调用TimerTask的run()方法。这个属性以毫秒作为单位,86400000指定该任务每24小时运行一次10X1000属性scheduledTimerTasks  要求一个需要启动的定时器任务列表。ScheduledTimerTask有一个delay属性, 允许你指定当任务第一次运行之前应该等多久。如,EmailReportTask的第一次运行延迟5毫秒
-->
<bean id="scheduledReportTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
        <property name="timerTask">
            <ref bean="reportTimerTask"/>
        </property>
        <property name="period">
            <value>10000</value>
        </property>
        <property name="delay">
            <value>5000</value>
        </property>
    </bean>

<!--Spring 的TimerFactoryBean负责启动定时任务。按以下方式在Spring配置文件里声明它-->
<bean class="org.springframework.scheduling.timer.TimerFactoryBean">
        <property name="scheduledTimerTasks">
            <list>
                <ref bean="scheduledReportTask"/>
            </list>
        </property>
    </bean> 
</beans>

第三步 相关类的编写
EmailReportTask.java
public class EmailReportTask extends TimerTask {//必需继承TimerTask
     Log log= LogFactory.getLog(EmailReportTask.class);
     public EmailReportTask() {
     }

     public void run() {//这个函数是调度任务执行的入口
        log.debug("task begin :"+testBean.greeting);
     }

     private TestBean testBean;//这里实现spring的依赖注入

     public void setTestBean(TestBean testBean) {
         this.testBean = testBean;
     }
 }

testBean.java
 public class TestBean {
     public String greeting="hello,world";
 }

spring+Quartz
Quartz 作业调度框架所提供的 API 在两方面都表现极佳:既全面强大,又易于使用。Quartz 可以用于简单的作业触发,也可以用于复杂的 JDBC 持久的作业存储和执行。
第一步  同上
第二步  配置applicationContextTimeTask.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="reportJob" class="org.springframework.scheduling.quartz.JobDetailBean">
  <property name="jobClass">
   <value>com.photo.task.EmailReportTask2</value>
  </property>
  <property name="jobDataAsMap">
   <map>
    <entry key="testBean">
     <ref bean="testBean"/>
    </entry>
   </map>
  </property>
 </bean>

<!--用它来指定一个工作应以怎样的频率运行,及第一次运行工作前应等多久-->
<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>

<!--
CronTriggerBean允许更精确的控制任务的运行时间。如果要在每天的6:00运行任务可以按照以下方式声明一个CronTriggerBean
0 0 6 * * ?
jobDetail属性告诉触发器调度哪一个工作,属性cronExpression告诉触发器何时触发。一个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)
  每一个元素都可以显示规定的一个值,一个区间(9-14),一个列表(9,12,14)或一个通配符(*)月份中的日期和星期中的日期这两个元素时互斥的一起应该通过设置一个问号(?)来表明不想设置那个字段
对于cronReportTrigger我们设置的cronExpression为 0 0 6 * * ?可以读作任意月份任何日期的6时0分0秒执行触发器
在使用的过程中,需要再对cronExpression的配置解释一下,如果没有使用过unix的cron,这里确实有点让人迷惑,我便在这里迷惑了一把。
Cron表达式是字符串,它由六个或七个子表达式组成,它描述了不同的调度细节。这些子表达式被白色表达式隔开,格式为* * * * * *
以下的表格对表达式做出了解释
域          是否必须 允许的值       允许的字符
Seconds      YES       0-59                   , - * /
Minutes      YES       0-59                   , - * /
Hours        YES       0-23                    , - * /
Day of month YES       1-31              , - * ? / L W C
Month        YES       1-12 or JAN-DEC, - * /
Day of week  YES   1-7 or SUN-SAT , - * ? / L C #
Year         NO         empty,1970-2099,   - * /

比如:字符串“0 0 12 ? * WEB 意味着每周三上午12:00。
特殊字符的一些说明:
* 表示的是所有的值,比如在秒的位置上有* 则表示为每一秒种。所以,你在表示每5分钟执行一次的时候便不能写成 * 0/5 * * * ? 而应该是0 0/5 * * * ?
? 表示没有指定特别的值,是允许为月的某一天或者周的某一天字段的。它被用来限定"没有限定值"。这是有用的,当你需要限定一些事情在一个或两个字段中,但不是这里的。
有一个特别需要主意的地方便是*与?的搭配使用。比如在Day of month与Day of week全是* ,那边自相矛盾了。官网中给出的例子没出现过这种情况。
- 表示范围,比如Hours域中10-12,则表示 "the hours 10, 11 and 12".
,表示指定特别的附加值,比如"MON,WED,FRI" 在 day of week 域表示"the days Monday, Wednesday, and Friday"
/ 表示指定的增长范围。比如"0/15" 在秒的区域表示"0, 15, 30, and 45"秒。

"L"字符是允许用来月某天和周某天字段。这个字符是一个"last"的缩写,但是它有不同的意义在两个字段的其中之一。例如,这个值"L"在月字段的某一天意味着" 这个月的最后一天",31或者28等等。
-->
<bean id="cronReportTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
  <property name="jobDetail">
   <ref bean="reportJob"/>
  </property>
  <property name="cronExpression">
   <value>0/5 * * * * ?</value>
  </property>
 </bean>
 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  <property name="triggers">
   <list>
    <ref bean="cronReportTrigger"/>
   </list>
  </property>
 </bean>
</beans>
 
第三步 相关类的编写
EmailReportTask2.java
 public class EmailReportTask2 extends QuartzJobBean {
     Log log = LogFactory.getLog(EmailReportTask.class);

     public EmailReportTask2() {
     }
 //这个函数是调度任务执行的入口
     protected void executeInternal(JobExecutionContext jobExecutionContext) throws org.quartz.JobExecutionException {

         log.debug("task 2 begin :" + testBean.greeting);
     }


     private TestBean testBean;//这里实现spring的依赖注入

     public void setTestBean(TestBean testBean) {
         this.testBean = testBean;
     }
 }

转载于:https://my.oschina.net/GeminiLiu/blog/497294

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值