Quartz整合Spring的練習

來源:互聯網
上載者:User

前段時間做了一個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和triggerscheduler.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.xsdhttp://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.xsdhttp://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...");    }}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.