一.Quartz介紹
Quartz是一個作業(yè)調(diào)度系統(tǒng)(a job scheduling system),負責(zé)在約定的時間到達時執(zhí)行(或通知)其他軟件控制。是一個Java的定時任務(wù)框架,使用它可以方便的實現(xiàn)計劃任務(wù),即在某個時間或每隔一定時間運行一個任務(wù)。Quartz的核心是Job/JobDetail,Trigger和Scheduler。
1.Job/JobDetail
Job/JobDetail=既要執(zhí)行的任務(wù),可以通過實現(xiàn)Job(interface)中的excute方法來指定任務(wù)的具體操作。 他描述了一個任務(wù)具體的信息,比如名稱,組名等等。JobDetail對象是在Quartz的客戶端(我們的程序)在Job被關(guān)聯(lián)加入到Scheduler時創(chuàng)建的,JobDetail包含了Job的各種屬性值和 JobDataMap,JobDataMap中存放了與之相關(guān)的Job類實例的狀態(tài)信息。
2.Trigger
用于控制一組Job的觸發(fā),包裹SimmperTrigger和CronTrigger,后者支持一種描述觸發(fā)事件和間隔的表達式語言。Quartz有個很好的想法就是分離了任務(wù)和任務(wù)執(zhí)行的條件。Trigger就是控制任務(wù)執(zhí)行條件的類,當(dāng)Trigger認為執(zhí)行條件滿足的時刻,Trigger會通知相關(guān)的Job去執(zhí)行。分離的好處是:
1).你可以為某個Job關(guān)聯(lián)多個Trigger,其中任何一個條件滿足都可以觸發(fā)job執(zhí)行,這樣可以完成一些組合的高級觸發(fā)條件
2).當(dāng)Trigger失效后(比如:一個永遠都不能滿足的條件),你不必去聲明一個新的job,代替的是你可以為job關(guān)聯(lián)一個新的Trigger讓job可以繼續(xù)執(zhí)行。
3.Scheduler是控制和管理觸發(fā)器的啟動和終止。
使用Scheduler前必須實例化Scheduler,需要由SchedulerFactory類來創(chuàng)建Scheduler,Factory的實例可以通過在JNDI存儲中的Factory的序列化的方式獲取,實例化Factory后直接使用該實例很容易。如下:
public class WangyouQuartzListener extends QuartzInitializerListener {
public static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
public WangyouQuartzListener() {
super();
}
public void contextInitialized(ServletContextEvent event) {
super.contextInitialized(event);
String factoryKey = event.getServletContext().getInitParameter("servlet-context-factory-key");
if (factoryKey == null) {
factoryKey = QUARTZ_FACTORY_KEY;
}
StdSchedulerFactory factory = (StdSchedulerFactory) event.getServletContext().getAttribute(factoryKey);
try {
QuartzScheduleHolder.getInstance().setScheduler(factory.getScheduler());
//per 2 hours add friends
Trigger trigger = TriggerUtils.makeHourlyTrigger(24);
//Trigger trigger = TriggerUtils.makeSecondlyTrigger(60);
trigger.setName(AddNewUserFriendJobDetail.JOB_NAME);
trigger.setStartTime(this.getBeforeAfterDate(1,-13));
QuartzScheduleHolder.getInstance().getScheduler().scheduleJob(new AddNewUserFriendJobDetail(),trigger);
//把job和Trigger關(guān)聯(lián),這樣當(dāng)Trigger認為應(yīng)該觸發(fā)的時候就會調(diào)用(實際上是Scheduler調(diào)用)job.execute方法了。
//per 3 day send mail and leave message
Trigger trigger2 = TriggerUtils.makeHourlyTrigger(24*3);
trigger2.setStartTime(this.getBeforeAfterDate(1,-12));
trigger2.setName(LeaveMessageNewUserJobDetail.JOB_NAME);
QuartzScheduleHolder.getInstance().getScheduler().scheduleJob(new LeaveMessageNewUserJobDetail(),trigger2);
// per 6 recommend video
Trigger trigger3 = TriggerUtils.makeHourlyTrigger(24*7);
trigger3.setName(RecommendVideoNewUserJobDetail.JOB_NAME);
trigger3.setStartTime(this.getBeforeAfterDate(2,-11));
QuartzScheduleHolder.getInstance().getScheduler().scheduleJob(new RecommendVideoNewUserJobDetail(),trigger3);
QuartzScheduleHolder.getInstance().getScheduler().start();
} catch (Exception e) {
e.printStackTrace();
}
}
public void contextDestroyed(ServletContextEvent event) {
super.contextDestroyed(event);
QuartzScheduleHolder.getInstance().setScheduler(null);
}
private Date getBeforeAfterDate( int day,int hour){
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE,day);
cal.add(Calendar.HOUR,hour);
return cal.getTime();
}
}
二。Spring Quartz
Spring的scheduling。quartz包中對Quartz的框架進行封裝,使得開發(fā)時不用寫任何Quartz和Spring的代碼就可以實現(xiàn)定時任務(wù)。Spring通過JobDetailBean,MethodInvokingJobDetailFactoryBean實現(xiàn)Job的定義,后者更加使用,只需指定要運行的類,和該類中運行的方法即可,Spring將自動生成符合Quartz要求的JobDetail。例如:
1.jobDetail
public class SayHelloJob {
private static DateFormat dateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public void sayHello(){
Date date = new Date();
System.out.println(dateFormat.format(date)+" :"+this.getMessage() );
}
}
2.spring的配置文件:quartzbean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="sayHelloJob" class="com.fg114.takeout.job.SayHelloJob">
<property name="message" value="start .............." />
</bean>
<bean name="sayHelloDetailBean" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="sayHelloJob" />
<property name="targetMethod" value="sayHello"/>
</bean>
<bean name="simpleTriggerBean" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<!--這里定義定時任務(wù)的對象的位置-->
<property name="jobDetail" ref="sayHelloDetailBean"/>
<!--這里定義每六秒鐘程序執(zhí)行一次-->
<property name=""></property>
<property name="repeatInterval" value="6000"/>
<!--這里定義程序啟動兩秒鐘后開始執(zhí)行-->
<property name="startDelay" value="2000"/>
</bean>
<! -- 啟動任務(wù) -->
<bean name="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simpleTriggerBean"/>
</list>
</property>
</bean>
</beans>
3.web.xml :
加入
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
注意:common-collections.jar 版本布不能是2.1版本的
posted on 2009-03-23 10:56
冰是沒有未來的,因為它的永恒 閱讀(2435)
評論(0) 編輯 收藏 所屬分類:
java