欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Spring中定時任務(wù)的幾種實現(xiàn)(備用)

系統(tǒng) 2494 0

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

spring框架來介紹。

一.分類

  • 從實現(xiàn)的技術(shù)上來分類,目前主要有三種技術(shù)(或者說有三種產(chǎn)品):

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

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

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

?

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

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

?

?

二.用法說明

詳細介紹每種任務(wù)調(diào)度工具的使用方式,包括Quartz和spring task兩種。

Quartz

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

第一步:定義作業(yè)類

?

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. //調(diào)度工廠實例化后,經(jīng)過timeout時間開始執(zhí)行調(diào)度 ??
  9. public ? void ?setTimeout( int ?timeout)?{??
  10. this .timeout?=?timeout;??
  11. }??
  12. ??
  13. /** ?
  14. *?要調(diào)度的具體任務(wù) ?
  15. */ ??
  16. @Override ??
  17. protected ? void ?executeInternal(JobExecutionContext?context)??
  18. throws ?JobExecutionException?{??
  19. ??System.out.println( "定時任務(wù)執(zhí)行中…" );??
  20. }??
  21. }??

?第二步:spring配置文件中配置作業(yè)類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代碼中定義的任務(wù)類,jobDataAsMap屬性即該任務(wù)類中需要注入的屬性值。

第三步:配置作業(yè)調(diào)度的觸發(fā)方式(觸發(fā)器)

Quartz的作業(yè)觸發(fā)器有兩種,分別是

org.springframework.scheduling.quartz.SimpleTriggerBean

org.springframework.scheduling.quartz.CronTriggerBean

第一種SimpleTriggerBean,只支持按照一定頻度調(diào)用任務(wù),如每隔30分鐘運行一次。

配置方式如下:

?

Xml代碼?? 收藏代碼
  1. < bean ? id = "simpleTrigger" ? class = "org.springframework.scheduling.quartz.SimpleTriggerBean" > ??
  2. < property ? name = "jobDetail" ? ref = "job1" ? /> ??
  3. < property ? name = "startDelay" ? value = "0" ? /> <!--?調(diào)度工廠實例化后,經(jīng)過0秒開始執(zhí)行調(diào)度?--> ??
  4. < property ? name = "repeatInterval" ? value = "2000" ? /> <!--?每2秒調(diào)度一次?--> ??
  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 > ??

?關(guān)于cronExpression表達式的語法參見附錄。

第四步:配置調(diào)度工廠?

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 > ??

?說明:該參數(shù)指定的就是之前配置的觸發(fā)器的名字。

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

?

?

第二種,作業(yè)類不繼承特定基類。

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

org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean

org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean

這兩個類分別對應(yīng)spring支持的兩種實現(xiàn)任務(wù)調(diào)度的方式,即前文提到到j(luò)ava自帶的timer task方式和Quartz方式。這里我只寫MethodInvokingJobDetailFactoryBean的用法,使用該類的好處是,我們的任務(wù)類不再需要繼承自任何類,而是普通的pojo。

第一步:編寫任務(wù)類

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

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

第二步:配置作業(yè)類

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" ? /> <!--?作業(yè)不并發(fā)調(diào)度?--> ??
  8. </ bean > ??

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

第三步:配置作業(yè)調(diào)度的觸發(fā)方式(觸發(fā)器)

Quartz的作業(yè)觸發(fā)器有兩種,分別是

org.springframework.scheduling.quartz.SimpleTriggerBean

org.springframework.scheduling.quartz.CronTriggerBean

第一種SimpleTriggerBean,只支持按照一定頻度調(diào)用任務(wù),如每隔30分鐘運行一次。

配置方式如下:

Xml代碼?? 收藏代碼
  1. < bean ? id = "simpleTrigger" ? class = "org.springframework.scheduling.quartz.SimpleTriggerBean" > ??
  2. < property ? name = "jobDetail" ? ref = "job2" ? /> ??
  3. < property ? name = "startDelay" ? value = "0" ? /> <!--?調(diào)度工廠實例化后,經(jīng)過0秒開始執(zhí)行調(diào)度?--> ??
  4. < property ? name = "repeatInterval" ? value = "2000" ? /> <!--?每2秒調(diào)度一次?--> ??
  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 > ??

以上兩種調(diào)度方式根據(jù)實際情況,任選一種即可。

第四步:配置調(diào)度工廠?

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 > ??

說明:該參數(shù)指定的就是之前配置的觸發(fā)器的名字。

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

?

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

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

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

?

Spring-Task

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

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

第一種:配置文件方式

第一步:編寫作業(yè)類

即普通的pojo,如下:

Java代碼?? 收藏代碼
  1. import ?org.springframework.stereotype.Service;??
  2. @Service ??
  3. public ? class ?TaskJob?{??
  4. ??????
  5. ???? public ? void ?job1()?{??
  6. ????????System.out.println(“任務(wù)進行中。。。”);??
  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配置文件中設(shè)置具體的任務(wù)

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參數(shù)指定的即任務(wù)類,method指定的即需要運行的方法,cron及cronExpression表達式,具體寫法這里不介紹了,詳情見上篇文章附錄。

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

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

第二種:使用注解形式

也許我們不想每寫一個任務(wù)類還要在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. }??

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

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.即表示從上一個任務(wù)完成開始到下一個任務(wù)開始的間隔,單位是毫秒。

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.即從上一個任務(wù)開始到下一個任務(wù)開始的間隔,單位是毫秒。

?

下面我來配置一下。

第一步:編寫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(“任務(wù)進行中。。。”);??
  9. ????}??
  10. }??

?第二步:添加task相關(guān)的配置:

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 />這句配置就可以了,這些參數(shù)都不是必須的。

?

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

附錄:

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

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

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

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

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

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

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

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

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

- 區(qū)間 ?

* 通配符 ?

? 你不想設(shè)置那個字段

下面只例出幾個式子

?

CRON表達式 ? ?含義?

"0 0 12 * * ?" ? ?每天中午十二點觸發(fā)?

"0 15 10 ? * *" ? ?每天早上10:15觸發(fā)?

"0 15 10 * * ?" ? ?每天早上10:15觸發(fā)?

"0 15 10 * * ? *" ? ?每天早上10:15觸發(fā)?

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

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

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

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

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

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

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

Spring中定時任務(wù)的幾種實現(xiàn)(備用)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲精品第五页中文字幕 | hdbbwsexvideo| WW.国产人妻人伦精品 | 91麻豆精品一二三区在线 | 精品欧美一区二区在线观看 | 亚洲午夜久久久精品影院 | 精品国产视频 | 黑人精品欧美一区二区蜜桃 | 欧美精品在线免费观看 | 日韩一级片在线免费观看 | 午夜小视频免费观看 | 91免费在线看 | 天天操综合网 | 久草在线资源视频 | 日韩欧美精品综合久久 | 国产在线不卡午夜精品2021 | 日韩欧美中文字幕在线观看 | 久久综合九色综合桃花 | 三级斤 | 亚洲3atv精品一区二区三区 | 精产国产伦理一二三区 | 日韩国产欧美一区二区三区 | 精品一区二区三区网站 | 亚洲综合久久伊人热 | 激情深爱 | 91福利在线观看 | 亚洲最新色 | 亚州激情 | 奇米 影音先锋 | 国产精品欧美一区二区在线看 | 手机看片国产免费现在观看 | 色先锋av资源中文字幕 | 日韩少妇成熟A片无码专区 黄在线免费观看 | 色噜噜狠狠色综合欧洲 | 亚洲AV无码色情第一综合网 | 国产精品久久久久久久久久红粉 | 日韩福利在线观看 | 国产精品v欧美精品∨日韩 一级免费黄色免费片 | 91精品国产91久久久久久吃药 | 日韩在线观看一区二区不卡视频 | 欧美高清色 |