使用Quartz实现项目中的任务调度
网上搜集加自己总结,闲话少说:
使用Quartz实现项目中的任务调度的基本步骤:
1、创建jobDetail作业任务
2、创建任务触发器
3、创建任务调度工厂来启动触发器
1、创建JobDetail
?
JobDetailBean:
?????? 用户可以直接使用Quartz的JobDetail在Spring中配置一个JobDetail Bean,但是JobDetail使用带参的构造函数,对于习惯通过属性配制的Spring用户来说存在使用上的不便。为此Spring通过扩展JobDetail提供了一个更具Bean风格的JobDetailBean。
??? JobDetailBean扩展于Quartz的JobDetail。使用该Bean声明JobDetail时,Bean的名字即是任务的名字,如果没有指定所属组,就使用默认组。除了JobDetail中的属性外,还定义了以下属性:
??? JobClass:类型为Class,实现Job接口的任务。
?? BeanName:默认为Bean的ID名,通过该属性显式指定Bean名称,它对应任务的名称。
?? JobDateAsMap:类型为Map,为任务所对应的JobDataMap提供值。之所以需要提供这个属性,是因为用户无法在Spring配置文件为JobDataAsMap类型的属性提供信息,所以Spring通过jobDataAsMap设置JobDataMap的值。
? ApplicationContextJobDataKey:用户可以将Spring ApplicationContext的引用保存到JobDataMap中,以便在Job的代码中访问ApplicationContext。为了达到这个目的,用户需要指定一个键,用以在jobDataAsMap中保存? ApplicationContext,如果不设置此键,JobDetailBean就不将ApplicationContext放入到JobDataMap中。
????????? JobListenerNames;类型为String[],指定注册在Scheduler中的JobListeners名称,以便让这些监听器对本任务的事件进行监听。
<bean id="autoSendJob" value="applicationContext"/> <property name="jobDataAsMap"> <map> <entry key="days"> <value>1</value> </entry> <entry key="isAutoSend"> <value>false</value> </entry> <entry key="isDebug"> <value>false</value> </entry> </map> </property> </bean>
?days、isAutoSend、isDebug是类中AutoSendScheduler中自己定义的属性!
public class AutoSendScheduler extends QuartzJobBean {private int days=1;private Boolean isAutoSend;private Boolean isDebug;protected void executeInternal(JobExecutionContext arg0) {Map dataMap = arg0.getJobDetail().getJobDataMap();ApplicationContext appCtx = (ApplicationContext)dataMap.get("applicationContext");。。。}}
?
<bean id="jobDetail_1" ref="myService"> <property name="targetMethod" value="doJob"> <property name="concurrent" value="false"></bean><bean id="myService" />? ?jobDetail_1将MyService#doJob()封装成一个任务,同时通过concurrent属性指定任务的类型,默认情况下封装为无状态的任务,如果希望目标封装为有状态的任务,仅需要将concurreng设置成false就可以了。 ? <bean id="simpleTrigger" name="code"><bean id="cronTrigger" src="/img/2012/06/30/2017525581.jpg"> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <!-- 一组触发器 --> <property name="triggers"> <list> <ref bean="simpleTrigger"/> </list> </property> </bean>? 。。。 参考: http://blog.csdn.net/CMTobby/archive/2007/09/21/1795257.aspx http://www.easyjf.com/blog/html/20071230/1015808.html http://www.iteye.com/topic/144515 http://www.iteye.com/topic/290532 http://www.ibm.com/developerworks/cn/java/j-quartz/public class MyService(){ public void doJob(){ System.out.println("doJobing....."); }}
Spring通过名为concurrent的属性指定任务的类型,能够更直接地描述任务执行的方式(有状态的任务不能并发执行,无状态的任务可并发执行)