亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Spring中定時任務的幾種實現(備用)

系統 2416 0

近日項目開發中需要執行一些定時任務,比如需要在每天凌晨時候,分析一次前一天的日志信息,借此機會整理了一下定時任務的幾種實現方式,由于項目采用spring框架,所以我都將結合

spring框架來介紹。

一.分類

  • 從實現的技術上來分類,目前主要有三種技術(或者說有三種產品):

  1. Java自帶的java.util.Timer類,這個類允許你調度一個java.util.TimerTask任務。使用這種方式可以讓你的程序按照某一個頻度執行,但不能在指定時間運行。一般用的較少,這篇文章將不做詳細介紹。
  2. 使用Quartz,這是一個功能比較強大的的調度器,可以讓你的程序在指定時間執行,也可以按照某一個頻度執行,配置起來稍顯復雜,稍后會詳細介紹。
  3. Spring3.0以后自帶的task,可以將它看成一個輕量級的Quartz,而且使用起來比Quartz簡單許多,稍后會介紹。
  • 從作業類的繼承方式來講,可以分為兩類:

  1. 作業類需要繼承自特定的作業類基類,如Quartz中需要繼承自org.springframework.scheduling.quartz.QuartzJobBean;java.util.Timer中需要繼承自java.util.TimerTask。
  2. 作業類即普通的java類,不需要繼承自任何基類。

注:個人推薦使用第二種方式,因為這樣所以的類都是普通類,不需要事先區別對待。

?

  • 從任務調度的觸發時機來分,這里主要是針對作業使用的觸發器,主要有以下兩種:
  1. 每隔指定時間則觸發一次,在Quartz中對應的觸發器為:org.springframework.scheduling.quartz.SimpleTriggerBean
  2. 每到指定時間則觸發一次,在Quartz中對應的調度器為:org.springframework.scheduling.quartz.CronTriggerBean

注:并非每種任務都可以使用這兩種觸發器,如java.util.TimerTask任務就只能使用第一種。Quartz和spring task都可以支持這兩種觸發條件。

?

?

二.用法說明

詳細介紹每種任務調度工具的使用方式,包括Quartz和spring task兩種。

Quartz

第一種,作業類繼承自特定的基類:org.springframework.scheduling.quartz.QuartzJobBean。

第一步:定義作業類

?

Java代碼?? 收藏代碼
  1. import ?org.quartz.JobExecutionContext;??
  2. import ?org.quartz.JobExecutionException;??
  3. import ?org.springframework.scheduling.quartz.QuartzJobBean;??
  4. public ? class ?Job1? extends ?QuartzJobBean?{??
  5. ??
  6. private ? int ?timeout;??
  7. private ? static ? int ?i?=? 0 ;??
  8. //調度工廠實例化后,經過timeout時間開始執行調度 ??
  9. public ? void ?setTimeout( int ?timeout)?{??
  10. this .timeout?=?timeout;??
  11. }??
  12. ??
  13. /** ?
  14. *?要調度的具體任務 ?
  15. */ ??
  16. @Override ??
  17. protected ? void ?executeInternal(JobExecutionContext?context)??
  18. throws ?JobExecutionException?{??
  19. ??System.out.println( "定時任務執行中…" );??
  20. }??
  21. }??

?第二步:spring配置文件中配置作業類JobDetailBean

Xml代碼?? 收藏代碼
  1. < bean ? name = "job1" ? class = "org.springframework.scheduling.quartz.JobDetailBean" > ??
  2. < property ? name = "jobClass" ? value = "com.gy.Job1" ? /> ??
  3. < property ? name = "jobDataAsMap" > ??
  4. < map > ??
  5. < entry ? key = "timeout" ? value = "0" ? /> ??
  6. </ map > ??
  7. </ property > ??
  8. </ bean > ??

?說明:org.springframework.scheduling.quartz.JobDetailBean有兩個屬性,jobClass屬性即我們在java代碼中定義的任務類,jobDataAsMap屬性即該任務類中需要注入的屬性值。

第三步:配置作業調度的觸發方式(觸發器)

Quartz的作業觸發器有兩種,分別是

org.springframework.scheduling.quartz.SimpleTriggerBean

org.springframework.scheduling.quartz.CronTriggerBean

第一種SimpleTriggerBean,只支持按照一定頻度調用任務,如每隔30分鐘運行一次。

配置方式如下:

?

Xml代碼?? 收藏代碼
  1. < bean ? id = "simpleTrigger" ? class = "org.springframework.scheduling.quartz.SimpleTriggerBean" > ??
  2. < property ? name = "jobDetail" ? ref = "job1" ? /> ??
  3. < property ? name = "startDelay" ? value = "0" ? /> <!--?調度工廠實例化后,經過0秒開始執行調度?--> ??
  4. < property ? name = "repeatInterval" ? value = "2000" ? /> <!--?每2秒調度一次?--> ??
  5. </ bean > ??

第二種CronTriggerBean,支持到指定時間運行一次,如每天12:00運行一次等。

配置方式如下:

Xml代碼?? 收藏代碼
  1. < bean ? id = "cronTrigger" ? class = "org.springframework.scheduling.quartz.CronTriggerBean" > ??
  2. < property ? name = "jobDetail" ? ref = "job1" ? /> ??
  3. <!—每天12:00運行一次?-- > ??
  4. < property ? name = "cronExpression" ? value = "0?0?12?*?*??" ? /> ??
  5. </ bean > ??

?關于cronExpression表達式的語法參見附錄。

第四步:配置調度工廠?

Xml代碼?? 收藏代碼
  1. < bean ? class = "org.springframework.scheduling.quartz.SchedulerFactoryBean" > ??
  2. < property ? name = "triggers" > ??
  3. < list > ??
  4. < ref ? bean = "cronTrigger" ? /> ??
  5. </ list > ??
  6. </ property > ??
  7. </ bean > ??

?說明:該參數指定的就是之前配置的觸發器的名字。

第五步:啟動你的應用即可,即將工程部署至tomcat或其他容器。

?

?

第二種,作業類不繼承特定基類。

Spring能夠支持這種方式,歸功于兩個類:

org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean

org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean

這兩個類分別對應spring支持的兩種實現任務調度的方式,即前文提到到java自帶的timer task方式和Quartz方式。這里我只寫MethodInvokingJobDetailFactoryBean的用法,使用該類的好處是,我們的任務類不再需要繼承自任何類,而是普通的pojo。

第一步:編寫任務類

Java代碼?? 收藏代碼
  1. public ? class ?Job2?{??
  2. public ? void ?doJob2()?{??
  3. System.out.println( "不繼承QuartzJobBean方式-調度進行中..." );??
  4. }??
  5. }??

?可以看出,這就是一個普通的類,并且有一個方法。

第二步:配置作業類

Xml代碼?? 收藏代碼
  1. < bean ? id = "job2" ??
  2. class = "org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" > ??
  3. < property ? name = "targetObject" > ??
  4. < bean ? class = "com.gy.Job2" ? /> ??
  5. </ property > ??
  6. < property ? name = "targetMethod" ? value = "doJob2" ? /> ??
  7. < property ? name = "concurrent" ? value = "false" ? /> <!--?作業不并發調度?--> ??
  8. </ bean > ??

?說明:這一步是關鍵步驟,聲明一個MethodInvokingJobDetailFactoryBean,有兩個關鍵屬性:targetObject指定任務類,targetMethod指定運行的方法。往下的步驟就與方法一相同了,為了完整,同樣貼出。

第三步:配置作業調度的觸發方式(觸發器)

Quartz的作業觸發器有兩種,分別是

org.springframework.scheduling.quartz.SimpleTriggerBean

org.springframework.scheduling.quartz.CronTriggerBean

第一種SimpleTriggerBean,只支持按照一定頻度調用任務,如每隔30分鐘運行一次。

配置方式如下:

Xml代碼?? 收藏代碼
  1. < bean ? id = "simpleTrigger" ? class = "org.springframework.scheduling.quartz.SimpleTriggerBean" > ??
  2. < property ? name = "jobDetail" ? ref = "job2" ? /> ??
  3. < property ? name = "startDelay" ? value = "0" ? /> <!--?調度工廠實例化后,經過0秒開始執行調度?--> ??
  4. < property ? name = "repeatInterval" ? value = "2000" ? /> <!--?每2秒調度一次?--> ??
  5. </ bean > ??

?第二種CronTriggerBean,支持到指定時間運行一次,如每天12:00運行一次等。

配置方式如下:

Xml代碼?? 收藏代碼
  1. < bean ? id = "cronTrigger" ? class = "org.springframework.scheduling.quartz.CronTriggerBean" > ??
  2. < property ? name = "jobDetail" ? ref = "job2" ? /> ??
  3. <!—每天12:00運行一次?-- > ??
  4. < property ? name = "cronExpression" ? value = "0?0?12?*?*??" ? /> ??
  5. </ bean > ??

以上兩種調度方式根據實際情況,任選一種即可。

第四步:配置調度工廠?

Xml代碼?? 收藏代碼
  1. < bean ? class = "org.springframework.scheduling.quartz.SchedulerFactoryBean" > ??
  2. < property ? name = "triggers" > ??
  3. < list > ??
  4. < ref ? bean = "cronTrigger" ? /> ??
  5. </ list > ??
  6. </ property > ??
  7. </ bean > ??

說明:該參數指定的就是之前配置的觸發器的名字。

第五步:啟動你的應用即可,即將工程部署至tomcat或其他容器。

?

到此,spring中Quartz的基本配置就介紹完了,當然了,使用之前,要導入相應的spring的包與Quartz的包,這些就不消多說了。

其實可以看出Quartz的配置看上去還是挺復雜的,沒有辦法,因為Quartz其實是個重量級的工具,如果我們只是想簡單的執行幾個簡單的定時任務,有沒有更簡單的工具,有!

請看我第下文Spring task的介紹。

?

Spring-Task

上節介紹了在Spring 中使用Quartz,本文介紹Spring3.0以后自主開發的定時任務工具,spring task,可以將它比作一個輕量級的Quartz,而且使用起來很簡單,除spring相關的包外不需要額外的包,而且支持注解和配置文件兩種

形式,下面將分別介紹這兩種方式。

第一種:配置文件方式

第一步:編寫作業類

即普通的pojo,如下:

Java代碼?? 收藏代碼
  1. import ?org.springframework.stereotype.Service;??
  2. @Service ??
  3. public ? class ?TaskJob?{??
  4. ??????
  5. ???? public ? void ?job1()?{??
  6. ????????System.out.println(“任務進行中。。。”);??
  7. ????}??
  8. }??

?第二步:在spring配置文件頭中添加命名空間及描述

Xml代碼?? 收藏代碼
  1. < beans ? xmlns = "http://www.springframework.org/schema/beans" ??
  2. ???? xmlns:task = "http://www.springframework.org/schema/task" ???
  3. ????。。。。。。??
  4. ???? xsi:schemaLocation = "http://www.springframework.org/schema/task?http://www.springframework.org/schema/task/spring-task-3.0.xsd" > ??

?第三步:spring配置文件中設置具體的任務

Xml代碼?? 收藏代碼
  1. ? < task:scheduled-tasks > ???
  2. ???????? < task:scheduled ? ref = "taskJob" ? method = "job1" ? cron = "0?*?*?*?*??" /> ???
  3. </ task:scheduled-tasks > ??
  4. ??
  5. < context:component-scan ? base-package = "?com.gy.mytask?" ? /> ??

說明:ref參數指定的即任務類,method指定的即需要運行的方法,cron及cronExpression表達式,具體寫法這里不介紹了,詳情見上篇文章附錄。

<context:component-scan base-package="com.gy.mytask" />這個配置不消多說了,spring掃描注解用的。

到這里配置就完成了,是不是很簡單。

第二種:使用注解形式

也許我們不想每寫一個任務類還要在xml文件中配置下,我們可以使用注解@Scheduled,我們看看源文件中該注解的定義:

Java代碼?? 收藏代碼
  1. @Target ({java.lang.annotation.ElementType.METHOD,?java.lang.annotation.ElementType.ANNOTATION_TYPE})??
  2. @Retention (RetentionPolicy.RUNTIME)??
  3. @Documented ??
  4. public ? @interface ?Scheduled??
  5. {??
  6. ?? public ? abstract ?String?cron();??
  7. ??
  8. ?? public ? abstract ? long ?fixedDelay();??
  9. ??
  10. ?? public ? abstract ? long ?fixedRate();??
  11. }??

?可以看出該注解有三個方法或者叫參數,分別表示的意思是:

cron:指定cron表達式

fixedDelay:官方文檔解釋:An interval-based trigger where the interval is measured from the completion time of the previous task. The time unit value is measured in milliseconds.即表示從上一個任務完成開始到下一個任務開始的間隔,單位是毫秒。

fixedRate:官方文檔解釋:An interval-based trigger where the interval is measured from the start time of the previous task. The time unit value is measured in milliseconds.即從上一個任務開始到下一個任務開始的間隔,單位是毫秒。

?

下面我來配置一下。

第一步:編寫pojo

Java代碼?? 收藏代碼
  1. import ?org.springframework.scheduling.annotation.Scheduled;????
  2. import ?org.springframework.stereotype.Component;??
  3. ??
  4. @Component (“taskJob”)??
  5. public ? class ?TaskJob?{??
  6. ???? @Scheduled (cron?=? "0?0?3?*?*??" )??
  7. ???? public ? void ?job1()?{??
  8. ????????System.out.println(“任務進行中。。。”);??
  9. ????}??
  10. }??

?第二步:添加task相關的配置:

Xml代碼?? 收藏代碼
  1. <? xml ? version = "1.0" ? encoding = "UTF-8" ?> ??
  2. < beans ? xmlns = "http://www.springframework.org/schema/beans" ??
  3. ???? xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" ? xmlns:aop = "http://www.springframework.org/schema/aop" ??
  4. ???? xmlns:context = "http://www.springframework.org/schema/context" ??
  5. ???? xmlns:tx = "http://www.springframework.org/schema/tx" ??
  6. ???? xmlns:task = "http://www.springframework.org/schema/task" ??
  7. ???? xsi:schemaLocation ="??
  8. ????????http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans-3.0.xsd??
  9. ????????http://www.springframework.org/schema/aop?http://www.springframework.org/schema/aop/spring-aop-3.0.xsd??
  10. ????????http://www.springframework.org/schema/context???
  11. http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd??
  12. ????????http://www.springframework.org/schema/tx?http://www.springframework.org/schema/tx/spring-tx-3.0.xsd??
  13. ????????http://www.springframework.org/schema/task?http://www.springframework.org/schema/task/spring-task-3.0.xsd"??
  14. ???? default-lazy-init = "false" > ??
  15. ??
  16. ??
  17. ???? < context:annotation-config ? /> ??
  18. ????<!—spring掃描注解的配置???-- > ??
  19. ???? < context:component-scan ? base-package = "com.gy.mytask" ? /> ??
  20. ??????
  21. <!—開啟這個配置,spring才能識別@Scheduled注解???-- > ??
  22. ???? < task:annotation-driven ? scheduler = "qbScheduler" ? mode = "proxy" /> ??
  23. ???? < task:scheduler ? id = "qbScheduler" ? pool-size = "10" /> ??

說明:理論上只需要加上<task:annotation-driven />這句配置就可以了,這些參數都不是必須的。

?

?Ok配置完畢,當然spring task還有很多參數,我就不一一解釋了,具體參考xsd文檔http://www.springframework.org/schema/task/spring-task-3.0.xsd。

附錄:

cronExpression的配置說明,具體使用以及參數請百度google

字段 ? 允許值 ? 允許的特殊字符

秒 ? ?0-59 ? ?, - * /

分 ? ?0-59 ? ?, - * /

小時 ? ?0-23 ? ?, - * /

日期 ? ?1-31 ? ?, - * ? / L W C

月份 ? ?1-12 或者 JAN-DEC ? ?, - * /

星期 ? ?1-7 或者 SUN-SAT ? ?, - * ? / L C #

年(可選) ? ?留空, 1970-2099 ? ?, - * /?

- 區間 ?

* 通配符 ?

? 你不想設置那個字段

下面只例出幾個式子

?

CRON表達式 ? ?含義?

"0 0 12 * * ?" ? ?每天中午十二點觸發?

"0 15 10 ? * *" ? ?每天早上10:15觸發?

"0 15 10 * * ?" ? ?每天早上10:15觸發?

"0 15 10 * * ? *" ? ?每天早上10:15觸發?

"0 15 10 * * ? 2005" ? ?2005年的每天早上10:15觸發?

"0 * 14 * * ?" ? ?每天從下午2點開始到2點59分每分鐘一次觸發?

"0 0/5 14 * * ?" ? ?每天從下午2點開始到2:55分結束每5分鐘一次觸發?

"0 0/5 14,18 * * ?" ? ?每天的下午2點至2:55和6點至6點55分兩個時間段內每5分鐘一次觸發?

"0 0-5 14 * * ?" ? ?每天14:00至14:05每分鐘一次觸發?

"0 10,44 14 ? 3 WED" ? ?三月的每周三的14:10和14:44觸發?

"0 15 10 ? * MON-FRI" ? ?每個周一、周二、周三、周四、周五的10:15觸發?

Spring中定時任務的幾種實現(備用)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 91网红福利精品区一区二 | 一级毛片免费一级直接观看 | 欧美巨大xxxx做受孕妇视频 | 亚洲一区中文字幕在线 | 久草视频在线网 | 91久久精品国产91性色tv | 不卡国产视频 | 成人免费久久精品国产片久久影院 | 日韩亚洲人成在线综合 | 狠狠色狠狠色综合日日32 | 麻豆va一区二区三区久久浪 | 人人乳乳香蕉大免费 | 国产日产精品久久久久快鸭 | 中文字幕在线激情日韩一区 | 一区二区三区四区 | 橘子视频在线观看 | 91不卡| 九九视频只有精品六 | 福利在线播放 | 女生毛片 | 草久视频 | 伊在人香蕉99久久 | 日日夜夜操操操 | 免费一级黄色毛片 | 久久99精品久久 | 亚洲热久久 | 国产成人啪精品 | 国产精品大全国产精品 | 久久精品中文字幕首页 | 国产成人福利 | 一本影院 | 日本在线观看永久免费网站 | 日韩久久精品 | 国产精品免费大片 | 亚洲乱亚洲乱妇无码 | 普通话对白国产情侣自啪 | 国产伦一区二区三区四区久久 | 亚洲成 人a影院青久在线观看 | 国产一区二区精品久久岳 | 老太婆性杂交毛片 | 女性一级全黄生活片 |