spring调度任务
Spring调度任务
目录
1调度任务1
1.1实现任务调度的背景1
1.2使用JAVA TIMER调度任务1
1.2.1创建一个定时器任务1
1.2.2创建一个调度定时器2
1.2.3启动定时器2
1.3使用QUARTZ调度器3
1.3.1创建一个Quartz工作3
1.3.2调度工作4
1.3.3启动工作5
1.4按调度计划调度方法5
1.4.1MethodInvokingTimerTaskFactoryBean实现Timer Task5
1.4.2MethodInvokingJobDetailFactoryBean实现Quartz6
1调度任务
在web应用系统中,我们有时候会需要某些事件的发生由系统来引起和完成,而不是所有事件都由用户的动作来引起的。即使应用系统的很多功能都是通过用户的行为来引起的,但有些时候,系统需要根据某些任务调度规划来发起一些事件并完成它。
1.1实现任务调度的背景
我在做一个ITSM(IT服务管理系统)的时候,需要完成一个功能:每天服务员责任任务处理时间只剩1/3的时候,需要邮件提醒服务员及时处理该任务。在该系统中我使用了SSH框架,对于该任务调度我采用了Spring的调度任务来实现。
1.2使用Java Timer调度任务
从Java1.3开始,Java SDK就通过java.util.Timer类提供了基本的调度功能。这个类允许你调度一个任务(通过java.util.TimerTask子类定义)按任意的周期运行。
Spring通过TimerFactoryBean向应用程序上下文提供了对java Timer的支持,TimerFactoryBean是一个Spring工厂类,用于在应用程序上下文中生存Java Timer。
Spring中使用Java Timer调度任务的实现:
1.2.1创建一个定时器任务
创建java Timer定时器任务需要继承java.util.TimerTask.
public class DailyMailTask extends TimerTask{
private MailTaskService mailTaskService;
@Override
public void run() {
mailTaskService.sendMailTask();
}
public MailTaskService getMailTaskService() {
return mailTaskService;
}
public void setMailTaskService(MailTaskService mailTaskService) {
this.mailTaskService = mailTaskService;
}
}
Run方法为任务运行时调度执行的方法。
<!--定时器任务-->
<bean id="dailyMailTask" ref="mailTaskService"></property>
</bean>
1.2.2创建一个调度定时器
Spring的ScheduledTimerTask定义了一个定时器任务的运行周期和延迟启动定时器。
<!-- 调度定时器任务 -->
<bean id="scheduledMailTimerTask " scheduledMailTimerTask"/>
</list>
</property>
</bean>
属性scheduledTimerTasks要求一个需要启动的定时器任务的列表。在此只包含一个指向scheduledMailTimerTask的引用。
1.3使用Quartz调度器
Java Timer只能指定任务执行的频度,但无法精确指定它何时运行,这是它的一个局限性。要想精确指定任务的启动时间,就需要使用Quartz调度器。
Quartz调度任务为我们调度工作提供了更丰富的支持,Quartz调度器不仅可以定义每隔多少毫秒执行一个工作,还允许你调度一个工作在某个特定的时间或日期执行。
Spring中使用Quartz调度任务的实现:
1.3.1创建一个Quartz工作
创建Quartz定时器任务需要继承Spring的QuartzJobBean.
public class DailyMailJob extends QuartzJobBean{
private MailTaskService mailTaskService;
@Override
protected void executeInternal(JobExecutionContext jobContext)
throws JobExecutionException {
mailTaskService.sendMailTask();
}
public MailTaskService getMailTaskService() {
return mailTaskService;
}
public void setMailTaskService(MailTaskService mailTaskService) {
this.mailTaskService = mailTaskService;
}
}
<!-- 声明邮件工作 -->
<bean id="quartzMailJob" mailTaskService">
<ref bean="mailTaskService"/>
</entry>
</map>
</property>
</bean>
JobDetailBean是Quartz的org.quartz.JobDetail的子类,它要求通过jobClass属性来设置一个job的实现。使用JobDetailBean的另一个特别之处是DailyMailJob的mailTaskService属性是间接设置的,通过jobDataAsMap来接受一个map(包含mailTaskService)注入DailyMailJob的mailTaskService属性。
1.3.2调度工作
Spring提供了两个触发器SimpleTriggerBean和CronTriggerBean。
SimpleTriggerBean与scheduledTimerTasks类似。指定工作的执行频度,模仿scheduledTimerTasks配置。
<!-- 定时调度simple quartz工作 -->
<bean id="simpleQuartzMailJobTrigger" ref="mailTaskService"></property>
<property name="targetMehtod ref="sendMialTask"></property>
</bean>
MethodInvokingTimerTaskFactoryBean 在幕后创建了一个TimerTask来对targetObject属性指定的对象调用targetMehod属性指定的方法。
1.4.2MethodInvokingJobDetailFactoryBean实现Quartz
要通过MethodInvokingJobDetailFactoryBean实现Quartz的工作调度,我们可以将1.3.1中创建一个工作调度换成下面配置:
<!--定时器任务-->
<bean id="dailyMailJob" ref="mailTaskService"></property>
<property name="targetMehtod ref="sendMialTask"></property>
</bean>
MethodInvokingJobDetailFactoryBean 在幕后创建了一个Quartz JobDetail来对targetObject属性指定的对象调用targetMehod属性指定的方法。
通过这种方式我们可以实现对某个类的某个方法进行调度,从而实现调度任务的功能。
-------------------------------------------------
参考《spring in action》