spring3.0定时任务;spring+Quartz定时任务

spring3.0定时任务:

 

Spring3.0以后,自己已经完全支持更加精确的时间,而不需要Quartz的支持:当然后面我们也会用Quartz实现任务的调度。

Spring3.0同样也使用cron表达式。与Quartz不同的是,Spring3.0不支持年,而Quartz支持年。但这点好象并不是非常重要。

cron表达式:-是用空格分开的时间字段,不使用年。

*(秒0-59)    *(分钟0-59)   *(小时0-23)  *(日期1-31)   *(月份1-12或是JAN-DEC)  *(星期1-7或是SUN-SAT)  

示例:
*/5  * * * * 6-7  :: 每个周6到周日,每隔5秒钟执行一次。

*/1 * * 7-9 1-2 1-7 :: 1月到2月中的7号到9号,且必须要满足周一到周日,每隔1秒钟执行一次。

*/1 * * 7-9 1,5 1-7  :: 注意里面的,(逗号),只有1月和5月的7到9号,且必须要满足周一到周日,每一秒钟执行一次。

*/1 17-59 * 7-9 1,5 1-7 :: 只解释17-59,是指从第17分钟到第59分钟,在指定的时间内,每一秒种执行一次
* 17-59 * 7-9 1,5 1-7   :: 此代码的功能与上面完全相同。如果不写秒即为每一秒执行一次。


59 19-23 * 7-9 1,5 1-7  :: 19分-23分的每59秒钟时只执行一次。

59 19,26 * 7-9 1,5 1-7  :: 注意里面的,(逗号),是指只有19分或是26分的56秒钟时执行一次。

* * 16-23 7-9 1,5 1-7   :: 定义每天的16点到23点每一秒钟执行一次。


59 59 23 * * 1-5  :: 定义每周1到周5,晚上23:59:59秒只执行一次。这个相当用有。可以工作时间每天给用户发邮件。

在Spring3.0中引用了新的命名空间-task:

task:scheduler 用于定义一个ThreadPoolTaskScheduler,并可以指定线程池的大小,即pool-size.所有任务队列都将会在指定大小的线程池中运行:
定义如下:
<!-- 对于同一个Pojo可以声明多次,并设置标记属性 -->
<bean id="one" class="cn.itcast.schedule.One">
<property name="task" value="A"></property>
</bean>
<bean id="two" class="cn.itcast.schedule.One">
<property name="task" value="B"></property>
</bean>
<bean id="three" class="cn.itcast.schedule.One">
<property name="task" value="C"></property>
</bean>
<!-- 声明一个具有两个线程的池,每一个对象将获取同样的运行机会 -->
<task:scheduler id="sch" pool-size="2"/>
<!-- 引用线程池 -->
<task:scheduled-tasks scheduler="sch">
<!-- 引用Spring Bean并设置调用的方法的时间间隔 -->
<task:scheduled ref="one" method="doSomeThing"  fixed-delay="#{1000*3}"/>
<task:scheduled ref="two" method="doSomeThing"  fixed-delay="#{1000*3}"/>
<task:scheduled ref="three" method="doSomeThing"  fixed-delay="#{1000*3}"/>
</task:scheduled-tasks>
<!-- 配置一个定时执行的任务 -->
<bean id="work" class="cn.itcast.schedule.Two"/>
<task:scheduler id="sendMail"/>
<task:scheduled-tasks scheduler="sendMail">
<!-- 定义在1月8号19:37:1秒执行一次,无论是周几 -->
<task:scheduled ref="work" method="work" cron="1 37 19 8 1 *"/>
</task:scheduled-tasks>

定义好之后,正常启动容器即可,只有条件符合,即会按要求执行任务。
 
 
 
 
 

简单解释一下Quartz:

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


在简单介绍下创建触发器的步骤:

    首先需要创建一个工作类,这个类必须继承Spring的QuartzJobBean

Tellingthetimejob.java代码

package jobs;

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


/**
 * @ProjectName:报时Demo  
 * @ClassName:TellingTheTimeJob  
 * @Description:  
 * @author:Sheep
 * @date:2012-4-19 下午03:58:11  
 * @Modifier:
 * @Modify Date: 
 * @Modify Note:  
 * @version
 */
public class TellingTheTimeJob extends QuartzJobBean {
 
 private ITellingTheTimeService tellingTheTimeService = null;

 @Override
 protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
  //调用报时方法
  this.tellingTheTimeService.tellingTheTime();
 }

 public ITellingTheTimeService getTellingTheTimeService() {
  return tellingTheTimeService;
 }

 public void setTellingTheTimeService(
   ITellingTheTimeService tellingTheTimeService) {
  this.tellingTheTimeService = tellingTheTimeService;
 }
}

 
package jobs;

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


/**
 * @ProjectName:报时Demo   
 * @ClassName:TellingTheTimeJob   
 * @Description:   
 * @author:Sheep
 * @date:2012-4-19 下午03:58:11   
 * @Modifier: 
 * @Modify Date:  
 * @Modify Note:   
 * @version
 */
public class TellingTheTimeJob extends QuartzJobBean {
	
	private ITellingTheTimeService tellingTheTimeService = null;

	@Override
	protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
		//调用报时方法
		this.tellingTheTimeService.tellingTheTime();
	}

	public ITellingTheTimeService getTellingTheTimeService() {
		return tellingTheTimeService;
	}

	public void setTellingTheTimeService(
			ITellingTheTimeService tellingTheTimeService) {
		this.tellingTheTimeService = tellingTheTimeService;
	}
}

     QuartzJobBean是Quartz中与Java的TimerTask等价的类。它实现了org.quartz.Job接口。executeInternal()方法定义了当预定的时刻来临时应该执行哪些动作。


接着我们须在Sping配置文件中声明这个Job。

Xml代码

<!-- 配置一个Job -->  

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

        <property name="jobClass" value="jobs.TellingTheTimeJob"/>  

        <property name="jobDataAsMap">  

            <map>  

               <entry key="tellingTheTimeService" value-ref="tellingTheTimeService"></entry>  

            </map>  

        </property>  

    </bean>  

    JobDetailBean 是Quartz的org.quartz.JobDetail的子类,它要求通过jobClass属性来设置一个Job对象。
    使用Quartz的JobDetail中的另一个特别之处是TellingTheTimeJob 的tellingTheTimeService 属性是间接设置的。JobDetail的jobDataAsMap属性接受一个java.util.Map,其中包含了需要设置给jobClass的各种属性。在这里,这个map包含了一个指向tellingTheTimeService的引用,它的键值为tellingTheTimeService 。当JobDetailBean实例化时,它会将tellingTheTimeService注入到TellingTheTimeJob 的tellingTheTimeService属性中。


    一个Job定义好了,那么我们怎么来实现触发器来调用这个Job呢?接着我们需要在Sping配置触发器。

    Spring提供了两个触发器,SimpleTriggerBean和CronTriggerBean。

    我们现在看看SimpleTriggerBean是怎么配置的,如下:

Xml代码

<!-- 简单的触发器 -->  

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

        <property name="jobDetail">  

            <ref bean="tellTheTimeJob" />  

        </property>  

        <!-- 以毫秒为单位,启动后一分钟触发 -->  

        <property name="startDelay">  

            <value>60000</value>  

        </property>  

        <!-- 每间隔一分钟触发一次 -->  

        <property name="repeatInterval">  

            <value>60000</value>  

        </property>  

    </bean>  

    SimpleTriggerBean与ScheduledTimerTask类似。你可以用它来指定一个工作应该以怎样的频度运行,以及(可选地)在第一次运行工作之前应该等待多久。其中,jobDetail 属性告诉触发器调度哪个工作。

    我们再来看看CronTriggerBean是怎么配置的,如下:

Xml代码

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

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

       <property name="jobDetail">  

            <ref bean="tellTheTimeJob"/>  

        </property>  

        <property name="cronExpression">  

            <!-- 这里是重点,可以自定义表达式实现定时触发。以下含义是每分钟触发一次 -->  

            <value>0 0/1 * * * ?</value>  

        </property>  

    </bean>  

    和SimpleTriggerBean一样,jobDetail属性告诉触发器调度哪个工作。属性cronExpression告诉触发器何时触发。我们可以通过配置cronExpression属性的value值来实现赋值的触发逻辑。

    一个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秒


   到了这里所需的一切都准备好了,那么如果启动这个触发器呢?我们需要在Sping XML如下配置:

Xml代码

<!-- Spring触发工厂 -->  

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

       <property name="triggers">  

           <list>  

              <ref bean="complexTellTheTimeTrigger"/>  

               <!-- ....下面可以继续添加其他触发器 -->  

            </list>  

        </property>  

    </bean>  

   Spring的SchedulerFactoryBean 是Quartz中与TimerFactoryBean等价的类。属性triggers接受一组触发器。因此只需简单地装配一个包含complexTellTheTimeTrigger的一个引用的即可。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值