日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring+Quartz实现定时任务

發布時間:2024/4/13 javascript 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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;??
  • /**?
  • ?*?繼承QuartzJobBean形式的定時任務?
  • ?*/??
  • ??
  • ??
  • import?java.text.SimpleDateFormat;??
  • import?java.util.Date;??
  • ??
  • import?org.quartz.JobExecutionContext;??
  • import?org.quartz.JobExecutionException;??
  • import?org.springframework.scheduling.quartz.QuartzJobBean;??
  • ??
  • /**?
  • ?*?@author?mhy2011@163.com?
  • ?*?@date?2013年12月21日?
  • ?*/??
  • 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"?/>??
  • ????<!--?延遲觸發時間,延遲10秒進行觸發?-->??
  • ????<property?name="startDelay"?value="10000"?/>??
  • ????<!--?重復觸發的時間間隔,5秒?-->??
  • ????<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
  • /**?
  • ?*?單獨Job類形式?
  • ?*/??
  • package?com.mhy.quartz;??
  • ??
  • import?java.text.SimpleDateFormat;??
  • import?java.util.Date;??
  • ??
  • /**?
  • ?*?@author?mhy2011@163.com?
  • ?*?@date?2013年12月21日?
  • ?*/??
  • 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"?/>??
  • ????<!--?每10秒運行一次?-->??
  • ????<property?name="cronExpression"?value="0/10?*?*?*?*??"?/>??
  • </bean>??
  • ??
  • <bean?class="org.springframework.scheduling.quartz.SchedulerFactoryBean">??
  • ????<property?name="triggers">??
  • ????????<list>??
  • ????????????<!--?<ref?bean="exampleJobTrigger"?/>?-->??
  • ????????????<ref?bean="exampleJob2Trigger"?/>??
  • ????????</list>??
  • ????</property>??
  • </bean>??
  • 好了,配置完之后我們再啟動一下程序,看看定時任務時否運行良好(這里我們使用的Trigger是CronTriggerFactoryBean,當然也可以使用SimpleTriggerFactoryBean)

    關于Trigger中時間如何配置,quartz官網描述的很清楚,大家可以參考如下網址:http://quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/crontrigger

    總結

    以上是生活随笔為你收集整理的Spring+Quartz实现定时任务的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。