前言
定時排程應該是每個項目必不可少的功能,像商城系統的報表的生成、商城和商戶的對賬,又或者是财務系統的定時同步資料,定時短信提醒等功能,應用十分廣泛。我在這裡主要講目前應用最廣泛的Quartz來做定時排程引擎.
Quartz介紹
Quartz是一個完全由java編寫的開源作業排程架構,由OpenSymphony開源組織創立于1998年。
下面是他的官網,大家可以去下載下傳最新的Quartz http://www.quartz-scheduler.org Quartz架構的核心是排程器。定時任務以作業的概念進行存儲。排程器通過觸發器來調用作業。
具體的概念這裡不講了,直接步入正題,先從目前項目整合Quartz開始,我來教大家如何在自己的項目中加入Quartz定時排程引擎 後續中會給大家講一下Quartz如何做叢集,以及定時排程如何單獨部署作為元件服務。
Spring整合Quartz的RAM方式
什麼是Quartz的RAM方式?看下面解釋... quartz最基本的概念就是job,在job内調用具體service完成具體功能,quartz需要把每個job存儲起來,友善排程,quartz存儲job方式就分三種,我們最常用的也是quartz預設的是RAMJobStore,RAMJobStore顧名思義就是把job的相關資訊存儲在記憶體裡,如果用spring配置quartz的job資訊的話,所有資訊是配置在xml裡,當spirng context啟動的時候就把xml裡的job資訊裝入記憶體。這一性質就決定了一旦JVM挂掉或者容器挂掉,記憶體中的job資訊就随之消失,無法持久化,優點就是配置簡單,我們先來學習這種最簡單常用的方式。
我們使用一個ssh的簡單demo來內建Quartz,模拟我們實際工作中從無到有加入定時排程,項目結構如下
1. 在項目中加入Quartz相關jar包
Spring.jar
quartz-all-1.8.6.jar
quartz-oracle-1.8.6.jar(如果是Oracle請加入這個jar包)
quartz-weblogic-1.8.6.jar(如果中間件使用的weblogic請加入這個jar包)
slf4j-api-1.5.6.jar
slf4j-log4j12-1.5.6.jar
2. 增加spring-time.xml配置檔案
内容如下
<?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEbeansPUBLIC"-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- 排程器lazy-init='false'那麼容器啟動就會執行排程程式 --> <beanid="startQuertz"lazy-init="false"autowire="no"class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <propertyname="triggers"> <list> <refbean="doTime"/> </list> </property> <!-- 允許在Quartz上下文中使用Spring執行個體工廠 --> <propertyname="applicationContextSchedulerContextKey"value="applicationContext"/> </bean> <!-- 觸發器 --> <beanid="doTime"class="org.springframework.scheduling.quartz.CronTriggerBean"> <propertyname="jobDetail"ref="jobtask"></property> <!-- cron表達式 --> <propertyname="cronExpression"value="10,15,20,25,30,35,40,45,50,55 * * * * ?"></property> </bean> <!-- 任務 --> <beanid="jobtask"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <propertyname="targetObject"ref="synUsersJob"></property> <propertyname="targetMethod"value="execute"></property> </bean> <!-- 要調用的工作類 --> <beanid="synUsersJob"class="org.leopard.core.quartz.job.SynUsersJob"></bean> </beans> |
Quartz的核心就是這個xml的配置
任務:jobtask定義了我們需要執行的定時任務類以及要執行的方法
觸發器:doTime定義了任務需要什麼時候執行(一個觸發器關聯一個job)
排程器:startQuertz負責加載任務和觸發器
3. 在web.xml中增加我們剛剛加入的spring-time.xml檔案
<context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:config/datasource.xml, classpath:config/spring/spring-common.xml, classpath:config/spring/spring-dao.xml, classpath:config/spring/spring-service.xml, classpath:config/spring/spring-time.xml </param-value> </context-param> |
4. 增加我們需要執行的定時任務bean,内容如下
package org.leopard.core.quartz.job; public class SynUsersJob { public void execute() { System.out.println("定時任務執行"); } } |
ok,配置完成我們啟動項目,看到如下輸入内容證明我們的項目加入定時任務成功了
項目加入Quartz的RAM方式配置是最簡單的,隻需要這幾步,我們就給我們的項目增加了定時排程的功能。
接下來會給大家講一下Quartz的DataBase方式和Quartz的叢集...
注意問題
問題一:spring核心包版本問題,替換下spring.jar為官方最新的就可以了
14:46:20,003 ERROR JobRunShell:232 - Job DEFAULT.jobtask threw an unhandled Exception: java.lang.NoClassDefFoundError: org/springframework/beans/PropertyAccessorFactory at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:77) at org.quartz.core.JobRunShell.run(JobRunShell.java:223) at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549) |