天天看點

一、在普通項目中增加定時排程引擎Quartz前言Quartz介紹Spring整合Quartz的RAM方式

前言

一、在普通項目中增加定時排程引擎Quartz前言Quartz介紹Spring整合Quartz的RAM方式

定時排程應該是每個項目必不可少的功能,像商城系統的報表的生成、商城和商戶的對賬,又或者是财務系統的定時同步資料,定時短信提醒等功能,應用十分廣泛。我在這裡主要講目前應用最廣泛的Quartz來做定時排程引擎.

Quartz介紹

Quartz是一個完全由java編寫的開源作業排程架構,由OpenSymphony開源組織創立于1998年。

下面是他的官網,大家可以去下載下傳最新的Quartz http://www.quartz-scheduler.org Quartz架構的核心是排程器。定時任務以作業的概念進行存儲。排程器通過觸發器來調用作業。

一、在普通項目中增加定時排程引擎Quartz前言Quartz介紹Spring整合Quartz的RAM方式

具體的概念這裡不講了,直接步入正題,先從目前項目整合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,模拟我們實際工作中從無到有加入定時排程,項目結構如下

一、在普通項目中增加定時排程引擎Quartz前言Quartz介紹Spring整合Quartz的RAM方式

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前言Quartz介紹Spring整合Quartz的RAM方式

項目加入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)

繼續閱讀