一.Quartz介紹
Quartz是一個作業調度系統(a job scheduling system),負責在約定的時間到達時執行(或通知)其他軟件控制。是一個Java的定時任務框架,使用它可以方便的實現計劃任務,即在某個時間或每隔一定時間運行一個任務。Quartz的核心是Job/JobDetail,Trigger和Scheduler。
1.Job/JobDetail
Job/JobDetail=既要執行的任務,可以通過實現Job(interface)中的excute方法來指定任務的具體操作。 他描述了一個任務具體的信息,比如名稱,組名等等。JobDetail對象是在Quartz的客戶端(我們的程序)在Job被關聯加入到Scheduler時創建的,JobDetail包含了Job的各種屬性值和 JobDataMap,JobDataMap中存放了與之相關的Job類實例的狀態信息。
2.Trigger
用于控制一組Job的觸發,包裹SimmperTrigger和CronTrigger,后者支持一種描述觸發事件和間隔的表達式語言。Quartz有個很好的想法就是分離了任務和任務執行的條件。Trigger就是控制任務執行條件的類,當Trigger認為執行條件滿足的時刻,Trigger會通知相關的Job去執行。分離的好處是:
1).你可以為某個Job關聯多個Trigger,其中任何一個條件滿足都可以觸發job執行,這樣可以完成一些組合的高級觸發條件
2).當Trigger失效后(比如:一個永遠都不能滿足的條件),你不必去聲明一個新的job,代替的是你可以為job關聯一個新的Trigger讓job可以繼續執行。
3.Scheduler是控制和管理觸發器的啟動和終止。
使用Scheduler前必須實例化Scheduler,需要由SchedulerFactory類來創建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關聯,這樣當Trigger認為應該觸發的時候就會調用(實際上是Scheduler調用)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的框架進行封裝,使得開發時不用寫任何Quartz和Spring的代碼就可以實現定時任務。Spring通過JobDetailBean,MethodInvokingJobDetailFactoryBean實現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">
<!--這里定義定時任務的對象的位置-->
<property name="jobDetail" ref="sayHelloDetailBean"/>
<!--這里定義每六秒鐘程序執行一次-->
<property name=""></property>
<property name="repeatInterval" value="6000"/>
<!--這里定義程序啟動兩秒鐘后開始執行-->
<property name="startDelay" value="2000"/>
</bean>
<! -- 啟動任務 -->
<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
冰是沒有未來的,因為它的永恒 閱讀(2432)
評論(0) 編輯 收藏 所屬分類:
java