生活随笔
收集整理的這篇文章主要介紹了
Spring+Quartz实现定时任务
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Spring整合Quartz實現定時任務步驟很簡單,大致需要經過如下幾步:創建任務(Job)、配置JobDetail、配置觸發器(Trigger)、配置SchedulerFactoryBean
首先使用Maven創建一個web項目并引入Spring和quartz的依賴(習慣使用這種開發模式了,當然不使用Maven也可以)
需要引入的依賴包如下:
[html] view plain
copy <dependency>??????<groupId>org.springframework</groupId>??????<artifactId>spring-context</artifactId>??????<version>3.2.6.RELEASE</version>??</dependency>??<dependency>??????<groupId>org.springframework</groupId>??????<artifactId>spring-context-support</artifactId>??????<version>3.2.6.RELEASE</version>??</dependency>??<dependency>??????<groupId>org.springframework</groupId>??????<artifactId>spring-web</artifactId>??????<version>3.2.6.RELEASE</version>??</dependency>??<dependency>??????<groupId>org.springframework</groupId>??????<artifactId>spring-tx</artifactId>??????<version>3.2.6.RELEASE</version>??</dependency>??<dependency>??????<groupId>org.quartz-scheduler</groupId>??????<artifactId>quartz</artifactId>??????<version>2.2.1</version>??</dependency>??<dependency>??????<groupId>org.quartz-scheduler</groupId>??????<artifactId>quartz-jobs</artifactId>??????<version>2.2.1</version>??</dependency>?? 此處我們使用的是Spring3.2.6+Quartz2.2.1版本進行實驗。
增加完Spring和Quartz的依賴包之后,就需要創建Spring配置文件,并在web.xml文件中引入Spring支持。
[html] view plain
copy <listener>??????<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>??</listener>??<context-param>??????<param-name>contextConfigLocation</param-name>??????<param-value>/WEB-INF/classes/applicationContext.xml</param-value>??</context-param>?? 好了,到現在為止,基本的環境算是搭建好了,接下來我們就要開始Spring+Quartz實現定時任務了。
一、創建任務(Job)
?
Spring+Quartz實現Job有兩種方式:一種是繼承org.springframework.scheduling.quartz.QuartzJobBean類來實現Job任務,并實現里面的抽象方法executeInternal;另一種是不繼承任何類,創建普通的Java類,然后自己指定任務的執行方法(個人感覺此種方式較好,實現起來方便而且大大降低了系統的業務的耦合性)。
我們先來看一下繼承QuartzJobBean類的這種形式,創建一個任務類ExampleJob,具體代碼如下:
?
[java] view plain
copy package?com.mhy.quartz;??????import?java.text.SimpleDateFormat;??import?java.util.Date;????import?org.quartz.JobExecutionContext;??import?org.quartz.JobExecutionException;??import?org.springframework.scheduling.quartz.QuartzJobBean;????public?class?ExampleJob?extends?QuartzJobBean?{????????????private?int?timeout;????????@Override??????protected?void?executeInternal(JobExecutionContext?context)??????????????throws?JobExecutionException?{??????????System.out.println(new?SimpleDateFormat("yyyy-MM-dd?HH:mm:ss").format(new?Date())?+?"執行ExampleJob的定時任務");??????}????????????public?int?getTimeout()?{??????????return?timeout;??????}????????public?void?setTimeout(int?timeout)?{??????????this.timeout?=?timeout;??????}????}?? 為了演示方便,executeInternal方法中沒有寫復雜的業務邏輯,只簡單的輸出一句話,真正的生產環境中在該方法中實現你所需要的業務邏輯即可。
?
二、在Spring配置文件中配置JobDetail
?
[html] view plain
copy <bean?name="exampleJobDetail"?class="org.springframework.scheduling.quartz.JobDetailBean">??????<property?name="jobClass"?value="com.mhy.quartz.ExampleJob"?/>??????<property?name="jobDataAsMap">??????????<map>??????????????<entry?key="timeout"?value="5"?/>??????????</map>??????</property>??</bean>?? ?
?
三、配置觸發器(Trigger)
Spring提供了兩種觸發器,如下:
1、org.springframework.scheduling.quartz.SimpleTriggerFactoryBean(此種方式是很隔多長時間進行觸發一次,比如每隔24小時觸發一次)
2、org.springframework.scheduling.quartz.CronTriggerFactoryBean(此種方式是在指定的時間進行觸發,比如只在周一進行觸發。不過根據配置也很方便的實現類似SimpleTriggerFactoryBean形式的定時任務)
Spring所提供的這兩種觸發器方式和前面提到的任務創建方式均可以相互之間混用,很靈活。
這里我們先使用SimpleTriggerFactoryBean這個trigger來配置
?
[html] view plain
copy <bean?id="exampleJobTrigger"??????class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">??????<property?name="jobDetail"?ref="exampleJobDetail"?/>??????????<property?name="startDelay"?value="10000"?/>??????????<property?name="repeatInterval"?value="5000"?/>??</bean>??
四、配置SchedulerFactoryBean
[html] view plain
copy <bean?class="org.springframework.scheduling.quartz.SchedulerFactoryBean">??????<property?name="triggers">??????????<list>??????????????<ref?bean="exampleJobTrigger"?/>??????????</list>??????</property>??</bean>??
好了,到現在為止,一個簡單的定時任務就完成了,下面我們來啟動一下web項目,看運行結果如何。?
從異常信息中我們可以看出,JobDetailBean引用了一個接口來作為父類了。既然是這樣的話,那我們就需要看一下JobDetailBean的源碼了。
從源碼中我們可以看到Spring的JobDetailBean繼承了Quartz的JobDetail,接下來我們就要看Quartz的JobDetail這個源碼了。
Quartz從1.X升級到2.X之后,JobDetail由類修改為接口了,為啥要改?那你得去問Quartz作者了,嘿嘿。那如果再繼續采用這種模式的話那肯定會錯嘍。那我們對它就沒有法子了么?怎么可能。處理它很簡單啊:一、把Quartz降到1.X版本;二、更改Job的實現方式。
可以看到在Quartz1.X版本中,JobDetail還是一個類。接下來我們再啟動一下web項目看看運行結果何如。
可以看到,在更換Quartz版本為1.X之后,定時任務正常運行了。
第二部分:實現Spring3+Quartz2的定時任務。
首先創建一個基本的Java類來做為Job任務類,代碼如下:
?
[java] view plain
copy package?com.mhy.quartz;????import?java.text.SimpleDateFormat;??import?java.util.Date;????public?class?ExampleJob2?{????????????public?void?execute(){??????????System.out.println(new?SimpleDateFormat("yyyy-MM-dd?HH:mm:ss").format(new?Date())?+?"執行ExampleJob2");??????}??}??
接下來是在Spring配置文件中配置JobDetail、Trigger、SchedulerFactoryBean
?
?
[html] view plain
copy <bean?id="exampleJob2"?class="com.mhy.quartz.ExampleJob2"></bean>??<bean?id="exampleJob2Detail"??????class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">??????????<property?name="targetObject"?ref="exampleJob2"?/>??????????<property?name="targetMethod"?value="execute"?/>??</bean>??<bean?id="exampleJob2Trigger"??????class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">??????<property?name="jobDetail"?ref="exampleJob2Detail"?/>??????????<property?name="cronExpression"?value="0/10?*?*?*?*??"?/>??</bean>????<bean?class="org.springframework.scheduling.quartz.SchedulerFactoryBean">??????<property?name="triggers">??????????<list>??????????????????????????<ref?bean="exampleJob2Trigger"?/>??????????</list>??????</property>??</bean>?? 好了,配置完之后我們再啟動一下程序,看看定時任務時否運行良好(這里我們使用的Trigger是CronTriggerFactoryBean,當然也可以使用SimpleTriggerFactoryBean)
關于Trigger中時間如何配置,quartz官網描述的很清楚,大家可以參考如下網址:http://quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/crontrigger
總結
以上是生活随笔為你收集整理的Spring+Quartz实现定时任务的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。