﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-esoa-文章分类-c. opensource.spring research</title><link>http://www.blogjava.net/esoa/category/13928.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 01 Mar 2007 14:15:04 GMT</lastBuildDate><pubDate>Thu, 01 Mar 2007 14:15:04 GMT</pubDate><ttl>60</ttl><item><title>spring 任务调度 </title><link>http://www.blogjava.net/esoa/articles/62733.html</link><dc:creator>comchyi</dc:creator><author>comchyi</author><pubDate>Thu, 10 Aug 2006 02:35:00 GMT</pubDate><guid>http://www.blogjava.net/esoa/articles/62733.html</guid><wfw:comment>http://www.blogjava.net/esoa/comments/62733.html</wfw:comment><comments>http://www.blogjava.net/esoa/articles/62733.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/esoa/comments/commentRss/62733.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/esoa/services/trackbacks/62733.html</trackback:ping><description><![CDATA[1.关于在spring中使用Quartz或Timer完成时序调度工作的介绍,可以参看&lt;&lt;Spring Framework 开发参考手册 version 1.1&gt;&gt;中的第18章(<a href="http://www.jactiongroup.net/reference/html/scheduling.html">http://www.jactiongroup.net/reference/html/scheduling.html</a>).<br /><br />2.用Quartz完成任务调度.<br />Quartz比java Timer更好的地方在于它允许调度一个任务在某个特定的时间或者日期执行<br /> (1).创建一个任务<br />  <font color="#800080">任务类需要从Spring 的QuartzJobBean类继承</font>，如:<br />   <br />public class TimeTriggerJob extends QuartzJobBean {<br />  private ChargingManagerService chargingManagerService;<br />     protected void executeInternal(JobExecutionContext arg0)<br />  throws JobExecutionException{<br />      System.out.println("start timeJobBean");<br />      try{<br />          chargingManagerService.insertFeeForTeacher();<br />      }catch(Exception e){<br />       <br />      }<br />     }<br />  /**<br />   * @param chargingManagerService The chargingManagerService to set.<br />   */<br />  public void setChargingManagerService(<br />    ChargingManagerService chargingManagerService) {<br />   this.chargingManagerService = chargingManagerService;<br />  }<br />  <br /> }<br />QuartzJobBean是Quartz中与java的TimerTask等价的类。它实现了org.quartz.Job接口，executeInternal()方法定义了在预定的时刻来临时执行那些动作。<br /> (2).Spring配置文件中声明<br />    &lt;bean id="timeJob" class="org.springframework.scheduling.quartz.JobDetailBean"&gt;<br />       &lt;property name="jobClass"&gt;<br />          &lt;value&gt;com.bytime.toss.finance.charge.common.TimeTriggerJob&lt;/value&gt;<br />       &lt;/property&gt;<br />       &lt;property name="jobDataAsMap"&gt;<br />         &lt;map&gt;<br />          &lt;entry key="chargingManagerService"&gt;<br />             &lt;ref bean ="chargingManagerService"/&gt;<br />           &lt;/entry&gt;<br />        &lt;/map&gt;<br />       &lt;/property&gt;<br />   &lt;/bean&gt;
<p>(3).调度任务<br />  <font color="#800080">Quartz的org.quartz.Trigger类描述了何时及怎样的频率来的运行一个Quartz工作</font>。Spring 提供     了两个触发器，SimpleTriggerBean和CronTriggerBean。<br />SimpleTriggerBean和ScheduledTimerTask类似，用它来指定一个工作应以怎样的频率运行，及第一次运行工作前应等多久。Spring装配如下:<br />  &lt;bean id=”simpleReportTrigger” class=”org.springframework.scheduling.quartz.SimpleTriggerBean”&gt;<br />   &lt;property name=”jobDetail”&gt;<br />    &lt;ref bean =”timeJob”&gt;<br />   &lt;/property&gt;<br />   &lt;property name=”startDelay”&gt;<br />    &lt;value&gt;3600000&lt;/value&gt;<br />   &lt;/property&gt;<br />   &lt;property name=”repeatInterval”&gt;<br />    &lt;value&gt;86400000&lt;/value&gt;<br />   &lt;/property&gt;<br /> CronTriggerBean允许更精确的控制任务的运行时间。如果要在每分钟的第30秒运行任务可以按照以下方式声明一个CronTriggerBean：<br />   &lt;bean id="timeTriggerJob" class="org.springframework.scheduling.quartz.CronTriggerBean"&gt;<br />      &lt;property name="jobDetail"&gt;<br />          &lt;ref bean ="timeJob"/&gt;<br />      &lt;/property&gt;<br />      &lt;property name="cronExpression"&gt;<br />         &lt;value&gt; 30 * * * * ?&lt;/value&gt; &lt;!-- ss mi hh dd mm ww yy 0 0 1 1 * ?--&gt;<br />      &lt;/property&gt;<br />  &lt;/bean&gt;<br />     和SimpleTriggerBean一样，jobDetail属性告诉触发器调度哪一个工作，属性cronExpression告诉触发器何时触发。一个cron表达式至少有6个由空格分隔的时间元素(最多7个)从左到右元素定义如下<br />  1。秒(0-59)<br />  2。分(0-59)<br />  3。小时(0-23)<br />  4。月份中的日期(1-31)<br />  5。月份(1-12 或 JAN-DEC)<br />  6。星期（1-7 或 SUN-SAT）<br />  7。年份（1970-2099）<br />    每一个元素都可以显示规定的一个值，一个区间（9－14），一个列表（9，12，14）或一个通配符(*)月份中的日期和星期中的日期这两个元素时互斥的一起应该通过设置一个问号(?)来表明不想设置那个字段<br />对于cronReportTrigger我们设置的cronExpression为 0 0 6 * * ?可以读作任意月份任何日期的6时0分0秒执行触发器.<br /></p><p>附：cronExpression配置说明</p><p></p><p></p><table cellspacing="8"><tbody><tr><th align="left">字段</th><th align="left"> </th><th align="left">允许值</th><th align="left"> </th><th align="left">允许的特殊字符</th></tr><tr><td align="left"><code><font face="新宋体">秒</font></code></td><td align="left"> </td><td align="left"><code><font face="新宋体">0-59</font></code></td><td align="left"> </td><td align="left"><code><font face="新宋体">, - * /</font></code></td></tr><tr><td align="left"><code><font face="新宋体">分</font></code></td><td align="left"> </td><td align="left"><code><font face="新宋体">0-59</font></code></td><td align="left"> </td><td align="left"><code><font face="新宋体">, - * /</font></code></td></tr><tr><td align="left"><code><font face="新宋体">小时</font></code></td><td align="left"> </td><td align="left"><code><font face="新宋体">0-23</font></code></td><td align="left"> </td><td align="left"><code><font face="新宋体">, - * /</font></code></td></tr><tr><td align="left"><code><font face="新宋体">日期</font></code></td><td align="left"> </td><td align="left"><code><font face="新宋体">1-31</font></code></td><td align="left"> </td><td align="left"><code><font face="新宋体">, - * ? / L W C</font></code></td></tr><tr><td align="left"><code><font face="新宋体">月份</font></code></td><td align="left"> </td><td align="left"><code><font face="新宋体">1-12 或者 JAN-DEC</font></code></td><td align="left"> </td><td align="left"><code><font face="新宋体">, - * /</font></code></td></tr><tr><td align="left"><code><font face="新宋体">星期</font></code></td><td align="left"> </td><td align="left"><code><font face="新宋体">1-7 或者 SUN-SAT</font></code></td><td align="left"> </td><td align="left"><code><font face="新宋体">, - * ? / L C #</font></code></td></tr><tr><td align="left"><code><font face="新宋体">年（可选）</font></code></td><td align="left"> </td><td align="left"><code><font face="新宋体">留空, 1970-2099</font></code></td><td align="left"> </td><td align="left"><code><font face="新宋体">, - * /</font></code></td></tr></tbody></table><br />表达式 意义 <br />"0 0 12 * * ?" 每天中午12点触发 <br />"0 15 10 ? * *" 每天上午10:15触发 <br />"0 15 10 * * ?" 每天上午10:15触发 <br />"0 15 10 * * ? *" 每天上午10:15触发 <br />"0 15 10 * * ? 2005" 2005年的每天上午10:15触发 <br />"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发 <br />"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发 <br />"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 <br />"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发 <br />"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发 <br />"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发 <br />"0 15 10 15 * ?" 每月15日上午10:15触发 <br />"0 15 10 L * ?" 每月最后一日的上午10:15触发 <br />"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发 <br />"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发 <br />"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发<br /><br />英文文档见:http://www.window07.com/dev/code/Java/2006-3-2/k56964.htm<br /><br /> (4)．启动任务<br />  <font color="#800080">Spring的SchedulerFactoryBean时Quartz中与TimerFactoryBean的等价类</font>。如下在Spring的配置文件中声明:<br />   &lt;bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"&gt;<br />   &lt;property name="triggers"&gt;<br />    &lt;list&gt;<br />     &lt;ref bean ="timeTriggerJob"/&gt;<br />    &lt;/list&gt;<br />   &lt;/property&gt;<br />  &lt;/bean&gt;<br /> triggers属性接收一组触发器<p>调度单次方法调用<br /> 为了达到这个目的Spring提供了MethodInvokingTimerTaskFactoryBean和MethodInvokingJobDetailFactoryBean，分别可以使用java的Timer支持或者Quartz调度器对方法进行调度。<br /> (1).&lt;bean id=”scheduledReportTask” class=”org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean”&gt;<br />  &lt;property name=”targetObject”&gt;<br />   &lt;ref bean=”chargingManagerService”/&gt;<br />  &lt;/property&gt;<br />  &lt;property name=”targetMethod”&gt;<br />   &lt;value&gt;sendCourseEnrollmentReport&lt;/value&gt;<br />  &lt;/property&gt;<br />  &lt;/bean&gt;</p><p>(2).&lt;bean id=”scheduledReportTask” class=”org.springframework.scheduling.timer.MethodInvokingJobDetailFactoryBean”&gt;<br />  &lt;property name=”targetObject”&gt;<br />   &lt;ref bean=”chargingManagerService”/&gt;<br />  &lt;/property&gt;<br />  &lt;property name=”targetMethod”&gt;<br />   &lt;value&gt;sendCourseEnrollmentReport&lt;/value&gt;<br />  &lt;/property&gt;<br />  &lt;/bean&gt;<br />3.参考<br /><a href="http://liuxufengfei.spaces.live.com/blog/cns!61ee325603765c6d!328.entry">http://liuxufengfei.spaces.live.com/blog/cns!61ee325603765c6d!328.entry</a></p><img src ="http://www.blogjava.net/esoa/aggbug/62733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/esoa/" target="_blank">comchyi</a> 2006-08-10 10:35 <a href="http://www.blogjava.net/esoa/articles/62733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>