程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Quartz與Spring的整合使用

Quartz與Spring的整合使用

編輯:JAVA綜合教程

Quartz與Spring的整合使用


之前說到過Quartz的基本使用),在實際使用中,我們通常會將定時任務交由spring容器來管理,所以今天我們來說說Quartz與spring的整合。

咱們還是按照Quartz的三大元素的順序來聊聊整合使用。

作業任務

在spring中對於Quartz的作業任務管理主要提供了兩種方式,JobDetailFactoryBean和MethodInvokingJobDetailFactoryBean,它們都在org.springframework.scheduling.quartz這個包下。下面我們來看看它們的使用。

JobDetailFactoryBean

spring對這個類的解釋為:A Spring FactoryBean for creating a Quartz JobDetail instance, supporting bean-style usage for JobDetail configuration.
一個用於創建Quartz JobDetail實例的,支持以bean定義風格來配置JobDetail的工廠bean。

對於在spring中的使用也是很簡單,首先我們需要創建一個具體的作業任務的實現類。使用JobDetailFactoryBean來管理作業任務時,我們的作業任務實現類需要繼承QuartzJobBean類,並覆蓋其executeInternal方法。就像下面這樣。

public class SimpleJob extends QuartzJobBean {

    @Override
    protected void executeInternal(JobExecutionContext arg0)
            throws JobExecutionException {
        System.out.println("現在時間為:"+new Date());
        //可以通過上下文獲取到JobDataMap,這裡面可以存放一些參數類型的數據
        JobDataMap dataMap=arg0.getMergedJobDataMap();
        String wish=(String) dataMap.get("wish");
        System.out.println(wish);
    }
}

然後就在spring容器中如下配置:

<code class=" hljs xml"><bean id="jobDetailFactoryBeanExample" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
    <!--{cke_protected}{C}%3C!%2D%2D%20%0A%20%20%20%20%20%20%20%20%E5%8F%82%E8%80%83%E6%BA%90%E7%A0%81%EF%BC%8C%E6%88%91%E4%BB%AC%E5%8F%AF%E4%BB%A5%E7%9C%8B%E5%88%B0%E5%B1%9E%E6%80%A7jobClass%E4%B8%BAClass%E7%B1%BB%E5%9E%8B%EF%BC%8C%E6%89%80%E4%BB%A5%E4%B8%8D%E8%83%BD%E4%BD%BF%E7%94%A8ref%E6%9D%A5%E5%BC%95%E7%94%A8%E4%B8%80%E4%B8%AAbean%EF%BC%8C%E5%90%A6%E5%88%99%E5%B0%B1%E4%BC%9A%E5%9B%A0%E4%B8%BA%E4%B8%8D%E8%83%BD%E5%B0%86bean%E8%BD%AC%E6%8D%A2%E4%B8%BAClass%E7%B1%BB%E5%9E%8B%E8%80%8C%E5%87%BA%E7%8E%B0%E5%BC%82%E5%B8%B8%E3%80%82%0A%20%20%20%20%20%20%20%20%3Cproperty%20name%3D%22jobClass%22%20ref%3D%22simpleJob%22%2F%3E%0A%20%20%20%20%20%20%20%20%E5%BF%85%E9%A1%BB%E4%BD%BF%E7%94%A8value%E5%AF%B9jobClass%E8%B5%8B%E5%80%BC%E3%80%82%20%0A%20%20%20%20%20%20%20%20%3Cproperty%20name%3D%22jobClass%22%20value%3D%22com.earl.quartz.spring.job.SimpleJob%22%2F%3E%20%20%20%20%0A%20%20%20%20%2D%2D%3E-->
    <property name="jobClass" value="com.earl.quartz.spring.job.SimpleJob">
    <!--{cke_protected}{C}%3C!%2D%2D%20%E8%BF%99%E9%87%8C%E8%AE%BE%E7%BD%AE%E7%9A%84jobDataAsMap%E5%8F%AF%E4%BB%A5%E4%BC%A0%E9%80%92%E4%B8%80%E4%BA%9B%E5%8F%82%E6%95%B0%E7%BB%99%E4%BD%9C%E4%B8%9A%E4%BB%BB%E5%8A%A1%20%2D%2D%3E-->
    <property name="jobDataAsMap"><map>
            <entry key="wish" value="hello">
        </entry></map>
    </property>
</property></bean></code>
MethodInvokingJobDetailFactoryBean

spring對這個類的解釋:FactoryBean that exposes a JobDetail object which delegates job execution to a specified (static or non-static) method.
這個FactoryBean提供JobDetail對象,這個對象可以指定作業任務的執行方法。

因為可以指定作業調度時執行的內容,所以使用起來就比JobDetailFactoryBean更加的靈活方便。首先我們還是創建一個作業任務的具體實現類,這個實現類就不需要繼承或實現其他的父類,只需要將我們想要執行的作業任務聲明在具體的方法中即可。如下:

public class ExampleJob{

    public void execute(){
        System.out.println("現在是"+new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒").format(new Date()));
    }

}

然後在spring容器中如下配置即可:

<code class=" hljs xml"><!--{cke_protected}{C}%3C!%2D%2D%20%0A%20%20%20%20%E5%A6%82%E6%9E%9C%E4%B8%A4%E4%B8%AA%E8%A7%A6%E5%8F%91%E5%99%A8%E8%A7%A6%E5%8F%91%E5%90%8C%E4%B8%80%E4%B8%AA%E4%BD%9C%E4%B8%9A%EF%BC%8C%E9%82%A3%E4%B9%88%E7%AC%AC%E4%BA%8C%E4%B8%AA%E4%BD%9C%E4%B8%9A%E5%8F%AF%E8%83%BD%E5%9C%A8%E7%AC%AC%E4%B8%80%E4%B8%AA%E4%BD%9C%E4%B8%9A%E5%AE%8C%E6%88%90%E4%B9%8B%E5%89%8D%E8%A2%AB%E8%A7%A6%E5%8F%91%E3%80%82%0A%20%20%20%20%E5%B0%86%E4%BD%9C%E4%B8%9A%E7%B1%BB%E5%AE%9E%E7%8E%B0StatefulJob%E6%8E%A5%E5%8F%A3%E5%B0%B1%E5%8F%AF%E4%BB%A5%E9%81%BF%E5%85%8D%E8%BF%99%E7%A7%8D%E6%83%85%E5%86%B5%E3%80%82%0A%20%20%20%20%E5%B0%86concurrent%E8%AE%BE%E7%BD%AE%E4%B8%BAfalse%E5%8F%AF%E4%BB%A5%E9%81%BF%E5%85%8D%E5%B9%B6%E5%8F%91%E7%9A%84%E5%8F%91%E7%94%9F%E3%80%82%0A%2D%2D%3E-->
<!--{cke_protected}{C}%3C!%2D%2D%20%E4%BD%BF%E7%94%A8MethodInvokingJobDetailFactoryBean%E6%9D%A5%E5%88%9B%E5%BB%BA%E4%BD%9C%E4%B8%9A%E5%AF%B9%E8%B1%A1%20%2D%2D%3E-->
<bean id="exampleJob" class="com.earl.quartz.spring.job.ExampleJob">
<bean id="methodInvokingJobDetailFactoryBeanExample" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!--{cke_protected}{C}%3C!%2D%2D%20%E7%9B%AE%E6%A0%87%E5%AF%B9%E8%B1%A1%EF%BC%8C%E6%8C%87%E7%9A%84%E6%98%AF%E4%BD%9C%E4%B8%9A%E4%BB%BB%E5%8A%A1%E7%9A%84%E5%AE%9E%E7%8E%B0%E7%B1%BB%20%2D%2D%3E-->
<property name="targetObject" ref="exampleJob">
<!--{cke_protected}{C}%3C!%2D%2D%20%E7%9B%AE%E6%A0%87%E6%96%B9%E6%B3%95%EF%BC%8C%E6%8C%87%E7%9A%84%E6%98%AF%E6%8C%87%E5%AE%9A%E5%AE%9E%E7%8E%B0%E7%B1%BB%E4%B8%AD%E7%9A%84%E5%93%AA%E4%B8%AA%E6%96%B9%E6%B3%95%E4%BD%9C%E4%B8%BA%E8%B0%83%E5%BA%A6%E6%97%B6%E7%9A%84%E6%89%A7%E8%A1%8C%E6%96%B9%E6%B3%95%20%2D%2D%3E-->
<property name="targetMethod" value="execute">
<!--{cke_protected}{C}%3C!%2D%2D%20%E6%98%AF%E5%90%A6%E5%B9%B6%E5%8F%91%20%2D%2D%3E-->
<property name="concurrent" value="false">
</property></property></property></bean></bean></code>

以上就是作業任務的相關內容,下面我們來看看觸發器這個可愛的小東東。

觸發器

在spring中,觸發器也分為simpleTrigger和cronTrigger,而且它們的使用也是非常簡單,只需要配置一個bean元素即可。下面我們分別看看它們兩者的配置:

simpleTrigger
<code class=" hljs xml"><bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
    <!--{cke_protected}{C}%3C!%2D%2D%20%E8%BF%99%E9%87%8C%E7%9A%84JobDetail%E6%8C%87%E7%9A%84%E5%B0%B1%E6%98%AF%E6%88%91%E4%BB%AC%E9%85%8D%E7%BD%AE%E7%9A%84%E4%BD%9C%E4%B8%9A%E4%BB%BB%E5%8A%A1%E7%9A%84bean%20%2D%2D%3E-->
    <property name="jobDetail" ref="methodInvokingJobDetailFactoryBeanExample">
    <!--{cke_protected}{C}%3C!%2D%2D%20%E5%BB%B6%E8%BF%9F5%E7%A7%92%E5%BC%80%E5%A7%8B%20%2D%2D%3E-->
    <property name="startDelay" value="5000"></property>
    <!--{cke_protected}{C}%3C!%2D%2D%20%E6%AF%8F3%E7%A7%92%E9%87%8D%E5%A4%8D%E4%B8%80%E6%AC%A1%20%2D%2D%3E-->
       <property name="repeatInterval" value="3000"></property>     
</property></bean></code>
cronTrigger

    
    
    
    

以上就是觸發器的基本配置,上述兩個觸發器的工廠bean還有一些其他的屬性,例如jobDataMap,priority等等。如果有需要,您可以參考相關的文檔。

調度程序

最後,最簡單的莫過於作業調度程序了,在spring中只需要這樣配置即可:

<code class=" hljs xml"><bean id="startQuartz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false">
    <!--{cke_protected}{C}%3C!%2D%2D%E6%8C%87%E5%AE%9A%E4%BD%BF%E7%94%A8%E5%93%AA%E4%BA%9B%E8%A7%A6%E5%8F%91%E5%99%A8%EF%BC%8Cspring%E4%BC%9A%E5%8E%BB%E8%B0%83%E5%BA%A6%E8%A7%A6%E5%8F%91%E7%9B%B8%E5%BA%94%E7%9A%84%E8%A7%A6%E5%8F%91%E5%99%A8%EF%BC%8C%E8%BF%9B%E8%80%8C%E5%AF%B9%E4%BD%9C%E4%B8%9A%E4%BB%BB%E5%8A%A1%E8%BF%9B%E8%A1%8C%E8%B0%83%E5%BA%A6%E5%A4%84%E7%90%86%2D%2D%3E-->
    <property name="triggers">
        <list>
<!--{cke_protected}{C}%3C!%2D%2D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cref%20bean%3D%22simpleTrigger%22%2F%3E%20%2D%2D%3E-->
            <ref bean="cronTrigger">
        </ref></list>
    </property>
</bean></code>

總結

以上就是對Quartz與Spring的整合使用的基本介紹了。總體來說,Quartz的定時任務功能已經很強大了,而spring對其的整合更是讓程序員在使用定時任務是如虎添翼。對於Quartz來說還有很多其他的功能,例如定時文件掃描,定時發送郵件等等,之後在另外一篇文章中再進行詳細介紹。

說明:本文介紹的是Quartz與Spring的整合使用,所以請參考源碼時關注com.earl.quartz.spring包下內容即可,其他可自行忽略。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved