前段時間做了一個quartz的練習,發現最近學習,都是網上東搜西找的。呵呵。
quartz一個定時任務的框架,類似windows平臺的任務計劃,linux平臺的crontab。
下面就附上代碼:
首先是個小例子,代碼實現的quartz:
用到的jar包先說一下:
aopalliance-1.0.jar、aspectjweaver-1.5.3.jar、c3p0-0.9.1.1.jar、commons-logging-1.0.4.jar、jta-1.1.jar、log4j-1.2.14.jar、
org.springframework.aop-3.1.0.RELEASE.jar、org.springframework.asm-3.1.0.RELEASE.jar、org.springframework.aspects-3.1.0.RELEASE.jar、
org.springframework.beans-3.1.0.RELEASE.jar、org.springframework.context.support-3.1.0.RELEASE.jar、org.springframework.context-3.1.0.RELEASE.jar、
org.springframework.core-3.1.0.RELEASE.jar、org.springframework.expression-3.1.0.RELEASE.jar、org.springframework.jdbc-3.1.0.RELEASE.jar、
org.springframework.transaction-3.1.0.RELEASE.jar、org.springframework.web.struts-3.1.0.RELEASE.jar、org.springframework.web-3.1.0.RELEASE.jar、
quartz-2.0.2.jar、quartz-all-2.0.2.jar、slf4j-api-1.6.1.jar、slf4j-log4j12-1.6.1.jar、
jar包有些多,有一些是多餘的,可以查一下!這裏沒有清理了!
注意:spring3.0版本中內置的Quartz版本是<2.0的,在使用最新的Quartz包(>2.0)之後,接口不兼容,導致程序報錯,下面的quartz配置文件裏面註釋瞭解決方法了。
main函數的類,testOne方法包含創建定時工廠和執行要執行的方法。
package com.zyujie.test;
import org.apache.log4j.Logger;
import org.quartz.CronTrigger;
import org.quartz.DateBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class SimpleExample {
private static Logger logger = Logger.getLogger(SimpleExample.class);
public static void main(String[] args) {
new SimpleExample().testOne();
}
private void testOne() {
try {
// 創建一個定時器工廠
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start(); // 啓動定時器
// 創建一個簡單的定時器生成器,該生成器根據一定的條件生成需要的定時器,比如按指定的時間間隔重複執行的簡單定時器
SimpleScheduleBuilder schedBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever();
// 創建一個觸發器,DateBuilder負責創建複雜的任務
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startAt(DateBuilder.nextGivenSecondDate(null, 2)).withSchedule(schedBuilder).build();
// 創建job明細,我們要執行的任務必須實現org.quartz.Job接口
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1").build();
// 獲取定時器
// 添加job到定時器,需要添加JobDetail和trigger
scheduler.scheduleJob(jobDetail, trigger);
// 啓動定時器
// scheduler.shutdown();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
//
////1.1 創建一個JobDetail實例,指定SimpleJob
//JobDetail jobDetail1 = JobBuilder.newJob(SimpleJob.class).withIdentity("job1-1", "group1").build();
//// 1.2 通過SimpleTrigger定義調度規則:馬上啓動,每1秒運行一次,共運行10次
//Trigger simpleTrigger1 = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
//.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).withRepeatCount(10)).startAt(new java.util.Date()).build();
//
//
//
//// 2.1 創建一個JobDetail實例,指定SimpleJob
//JobDetail jobDetail2 = JobBuilder.newJob(SimpleJob.class).withIdentity("job1_2", "group1").build();
//
//// 2.2 通過SimpleTrigger定義調度規則:馬上啓動,每2秒運行一次,共運行3次
//Trigger simpleTrigger2 = TriggerBuilder.newTrigger().withIdentity("trigger1_2", "group1")
//.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).withRepeatCount(3)).startNow().build();
//
//
//
//// 3.0 通過SchedulerFactory獲取一個調度器實例
//Scheduler scheduler;
//try {
// scheduler = StdSchedulerFactory.getDefaultScheduler();
//
// scheduler.scheduleJob(jobDetail1, simpleTrigger1); // 註冊並進行調度
// scheduler.scheduleJob(jobDetail2, simpleTrigger2); // 註冊並進行調度
//
// scheduler.start(); // 調度啓動
//} catch (SchedulerException e) {
// e.printStackTrace();
//}
下面是要執行的目標類:
package com.zyujie.test;
import java.text.SimpleDateFormat;
import org.apache.log4j.Logger;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class HelloJob implements Job {
private static Logger logger = Logger.getLogger(HelloJob.class);
public HelloJob() {
}
public void execute(JobExecutionContext arg0) throws JobExecutionException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("打印:" + sdf.format(new java.util.Date()));
}
}
執行main方法就可以了。下面是spring整合的quartz,這個用法應該實用,常見一些:
web.xml的配置就不寫了,就是load spring主配置文件即可,由於工程中配置,所以spring主配置文件如下:
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<!-- import products module -->
<import resource="quartz-config.xml" />
</beans>
下面是 quartz的配置文件,主要配置了目標類,目標方法,觸發時間這些:
<?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:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">
<!-- 要調用的工作類 -->
<bean id="quartzJob" class="com.zyujie.test.QuartzJob"></bean>
<!-- 定義調用對象和調用對象的方法 -->
<bean id="jobtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 調用的類 -->
<property name="targetObject">
<ref bean="quartzJob" />
</property>
<!-- 調用類中的方法 -->
<property name="targetMethod">
<value>work</value>
</property>
</bean>
<!-- 定義觸發時間 -->
<!-- <bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerBean"> -->
<!-- spring3.0版本中內置的Quartz版本是<2.0的,在使用最新的Quartz包(>2.0)之後,接口不兼容 -->
<!-- 解決方法是把Quartz版本降低到1.0,或者把spring加到3.1+。根據Spring的建議,將原來的**TriggerBean替換成**TriggerFactoryBean,例如CronTriggerBean 就可以替換成 CronTriggerFactoryBean。替換之後問題解決。-->
<bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="jobtask" />
</property>
<!-- cron表達式 -->
<property name="cronExpression">
<!-- 每隔10秒執行一次-->
<value>0/10 * * * * ?</value>
</property>
</bean>
<!-- 總管理類 如果將lazy-init='false'那麼容器啓動就會執行調度程序 -->
<bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="doTime" />
</list>
</property>
</bean>
</beans>
下面是quartz配置文件中配置的目標類和方法:
package com.zyujie.test;
import java.text.SimpleDateFormat;
public class QuartzJob {
public void work() {
System.out.println("Quartz的任務調度!!!");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("打印:" + sdf.format(new java.util.Date()));
}
}
當工程啓動的時候,web.xml就會load spring的主配置文件,就是去觸發quartz的cron表達式,執行目標類:
執行結果:
Quartz的任務調度!!!
打印:2013-06-17 18:07:40
Quartz的任務調度!!!
打印:2013-06-17 18:07:50
如果要單獨去讀quartz配置文件,執行目標類裏面的方法的話。我們可以通過ApplicationContext去做:
package com.zyujie.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainTest {
/**
* @param args
*/
public static void main(String[] args)
{
System.out.println("Test start...");
ApplicationContext context = new ClassPathXmlApplicationContext("quartz-config.xml");
//如果配置文件中將startQuertz bean的lazy-init設置爲false 則不用實例化
//context.getBean("startQuertz");
System.out.print("Test end...");
}
}