chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Spring Boot中整合兩種定時(shí)任務(wù)的方法

jf_78858299 ? 來源:江南一點(diǎn)雨 ? 作者:江南一點(diǎn)雨 ? 2023-04-07 14:55 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在 Spring + SpringMVC 環(huán)境中,一般來說,要實(shí)現(xiàn)定時(shí)任務(wù),我們有兩中方案,一種是使用 Spring 自帶的定時(shí)任務(wù)處理器 @Scheduled 注解,另一種就是使用第三方框架 Quartz ,Spring Boot 源自 Spring+SpringMVC ,因此天然具備這兩個(gè) Spring 中的定時(shí)任務(wù)實(shí)現(xiàn)策略,當(dāng)然也支持 Quartz,本文我們就來看下 Spring Boot 中兩種定時(shí)任務(wù)的實(shí)現(xiàn)方式。

@Scheduled

使用 @Scheduled 非常容易,直接創(chuàng)建一個(gè) Spring Boot 項(xiàng)目,并且添加 web 依賴 spring-boot-starter-web,項(xiàng)目創(chuàng)建成功后,添加 @EnableScheduling 注解,開啟定時(shí)任務(wù):

  1. @SpringBootApplication

  2. @EnableScheduling

  3. publicclassScheduledApplication{


  4. publicstaticvoid main(String[] args){

  5. SpringApplication.run(ScheduledApplication.class, args);

  6. }


  7. }

接下來配置定時(shí)任務(wù):

  1. @Scheduled(fixedRate =2000)

  2. publicvoid fixedRate(){

  3. System.out.println("fixedRate>>>"+newDate());

  4. }

  5. @Scheduled(fixedDelay =2000)

  6. publicvoid fixedDelay(){

  7. System.out.println("fixedDelay>>>"+newDate());

  8. }

  9. @Scheduled(initialDelay =2000,fixedDelay =2000)

  10. publicvoid initialDelay(){

  11. System.out.println("initialDelay>>>"+newDate());

  12. }

  1. 首先使用 @Scheduled 注解開啟一個(gè)定時(shí)任務(wù)。
  2. fixedRate 表示任務(wù)執(zhí)行之間的時(shí)間間隔,具體是指兩次任務(wù)的開始時(shí)間間隔,即第二次任務(wù)開始時(shí),第一次任務(wù)可能還沒結(jié)束。
  3. fixedDelay 表示任務(wù)執(zhí)行之間的時(shí)間間隔,具體是指本次任務(wù)結(jié)束到下次任務(wù)開始之間的時(shí)間間隔。
  4. initialDelay 表示首次任務(wù)啟動(dòng)的延遲時(shí)間。
  5. 所有時(shí)間的單位都是毫秒。

上面這是一個(gè)基本用法,除了這幾個(gè)基本屬性之外,@Scheduled 注解也支持 cron 表達(dá)式,使用 cron 表達(dá)式,可以非常豐富的描述定時(shí)任務(wù)的時(shí)間。cron 表達(dá)式格式如下:

[秒] [分] [小時(shí)] [日] [月] [周] [年]

具體取值如下:

序號(hào) 說明 是否必填 允許填寫的值 允許的通配符
1 0-59 - * /
2 0-59 - * /
3 時(shí) 0-23 - * /
4 1-31 - * ? / L W
5 1-12 or JAN-DEC - * /
6 1-7 or SUN-SAT - * ? / L #
7 1970-2099 - * /

這一塊需要大家注意的是,月份中的日期和星期可能會(huì)起沖突,因此在配置時(shí)這兩個(gè)得有一個(gè)是 ?

通配符含義:

  • ? 表示不指定值,即不關(guān)心某個(gè)字段的取值時(shí)使用。需要注意的是,月份中的日期和星期可能會(huì)起沖突,因此在配置時(shí)這兩個(gè)得有一個(gè)是 ?
  • * 表示所有值,例如:在秒的字段上設(shè)置 *,表示每一秒都會(huì)觸發(fā)
  • , 用來分開多個(gè)值,例如在周字段上設(shè)置 "MON,WED,FRI" 表示周一,周三和周五觸發(fā)
  • - 表示區(qū)間,例如在秒上設(shè)置 "10-12",表示 10,11,12秒都會(huì)觸發(fā)
  • / 用于遞增觸發(fā),如在秒上面設(shè)置"5/15" 表示從5秒開始,每增15秒觸發(fā)(5,20,35,50)
  • # 序號(hào)(表示每月的第幾個(gè)周幾),例如在周字段上設(shè)置"6#3"表示在每月的第三個(gè)周六,(用 在母親節(jié)和父親節(jié)再合適不過了)
  • 周字段的設(shè)置,若使用英文字母是不區(qū)分大小寫的 ,即 MON 與mon相同
  • L 表示最后的意思。在日字段設(shè)置上,表示當(dāng)月的最后一天(依據(jù)當(dāng)前月份,如果是二月還會(huì)自動(dòng)判斷是否是潤(rùn)年), 在周字段上表示星期六,相當(dāng)于"7"或"SAT"(注意周日算是第一天)。如果在"L"前加上數(shù)字,則表示該數(shù)據(jù)的最后一個(gè)。例如在周字段上設(shè)置"6L"這樣的格式,則表示"本月最后一個(gè)星期五"
  • W 表示離指定日期的最近工作日(周一至周五),例如在日字段上設(shè)置"15W",表示離每月15號(hào)最近的那個(gè)工作日觸發(fā)。如果15號(hào)正好是周六,則找最近的周五(14號(hào))觸發(fā), 如果15號(hào)是周未,則找最近的下周一(16號(hào))觸發(fā),如果15號(hào)正好在工作日(周一至周五),則就在該天觸發(fā)。如果指定格式為 "1W",它則表示每月1號(hào)往后最近的工作日觸發(fā)。如果1號(hào)正是周六,則將在3號(hào)下周一觸發(fā)。(注,"W"前只能設(shè)置具體的數(shù)字,不允許區(qū)間"-")
  • LW 可以一組合使用。如果在日字段上設(shè)置"LW",則表示在本月的最后一個(gè)工作日觸發(fā)(一般指發(fā)工資 )

例如,在 @Scheduled 注解中來一個(gè)簡(jiǎn)單的 cron 表達(dá)式,每隔5秒觸發(fā)一次,如下:

  1. @Scheduled(cron ="0/5 * * * * *")

  2. publicvoid cron(){

  3. System.out.println(newDate());

  4. }

上面介紹的是使用 @Scheduled 注解的方式來實(shí)現(xiàn)定時(shí)任務(wù),接下來我們?cè)賮砜纯慈绾问褂?Quartz 實(shí)現(xiàn)定時(shí)任務(wù)。

Quartz

一般在項(xiàng)目中,除非定時(shí)任務(wù)涉及到的業(yè)務(wù)實(shí)在是太簡(jiǎn)單,使用 @Scheduled 注解來解決定時(shí)任務(wù),否則大部分情況可能都是使用 Quartz 來做定時(shí)任務(wù)。在 Spring Boot 中使用 Quartz ,只需要在創(chuàng)建項(xiàng)目時(shí),添加 Quartz 依賴即可:

圖片

項(xiàng)目創(chuàng)建完成后,也需要添加開啟定時(shí)任務(wù)的注解:

  1. @SpringBootApplication

  2. @EnableScheduling

  3. publicclassQuartzApplication{

  4. publicstaticvoid main(String[] args){

  5. SpringApplication.run(QuartzApplication.class, args);

  6. }

  7. }

Quartz 在使用過程中,有兩個(gè)關(guān)鍵概念,一個(gè)是JobDetail(要做的事情),另一個(gè)是觸發(fā)器(什么時(shí)候做),要定義 JobDetail,需要先定義 Job,Job 的定義有兩種方式:

第一種方式,直接定義一個(gè)Bean:

  1. @Component

  2. publicclassMyJob1{

  3. publicvoid sayHello(){

  4. System.out.println("MyJob1>>>"+newDate());

  5. }

  6. }

關(guān)于這種定義方式說兩點(diǎn):

  1. 首先將這個(gè) Job 注冊(cè)到 Spring 容器中。
  2. 這種定義方式有一個(gè)缺陷,就是無法傳參。

第二種定義方式,則是繼承 QuartzJobBean 并實(shí)現(xiàn)默認(rèn)的方法:

  1. publicclassMyJob2extendsQuartzJobBean{

  2. HelloService helloService;

  3. publicHelloService getHelloService(){

  4. return helloService;

  5. }

  6. publicvoid setHelloService(HelloService helloService){

  7. this.helloService = helloService;

  8. }

  9. @Override

  10. protectedvoid executeInternal(JobExecutionContext jobExecutionContext)throwsJobExecutionException{

  11. helloService.sayHello();

  12. }

  13. }

  14. publicclassHelloService{

  15. publicvoid sayHello(){

  16. System.out.println("hello service >>>"+newDate());

  17. }

  18. }

和第1種方式相比,這種方式支持傳參,任務(wù)啟動(dòng)時(shí),executeInternal 方法將會(huì)被執(zhí)行。

Job 有了之后,接下來創(chuàng)建類,配置 JobDetail 和 Trigger 觸發(fā)器,如下:

  1. @Configuration

  2. publicclassQuartzConfig{

  3. @Bean

  4. MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean(){

  5. MethodInvokingJobDetailFactoryBean bean =newMethodInvokingJobDetailFactoryBean();

  6. bean.setTargetBeanName("myJob1");

  7. bean.setTargetMethod("sayHello");

  8. return bean;

  9. }

  10. @Bean

  11. JobDetailFactoryBean jobDetailFactoryBean(){

  12. JobDetailFactoryBean bean =newJobDetailFactoryBean();

  13. bean.setJobClass(MyJob2.class);

  14. JobDataMap map =newJobDataMap();

  15. map.put("helloService", helloService());

  16. bean.setJobDataMap(map);

  17. return bean;

  18. }

  19. @Bean

  20. SimpleTriggerFactoryBean simpleTriggerFactoryBean(){

  21. SimpleTriggerFactoryBean bean =newSimpleTriggerFactoryBean();

  22. bean.setStartTime(newDate());

  23. bean.setRepeatCount(5);

  24. bean.setJobDetail(methodInvokingJobDetailFactoryBean().getObject());

  25. bean.setRepeatInterval(3000);

  26. return bean;

  27. }

  28. @Bean

  29. CronTriggerFactoryBean cronTrigger(){

  30. CronTriggerFactoryBean bean =newCronTriggerFactoryBean();

  31. bean.setCronExpression("0/10 * * * * ?");

  32. bean.setJobDetail(jobDetailFactoryBean().getObject());

  33. return bean;

  34. }

  35. @Bean

  36. SchedulerFactoryBean schedulerFactoryBean(){

  37. SchedulerFactoryBean bean =newSchedulerFactoryBean();

  38. bean.setTriggers(cronTrigger().getObject(), simpleTriggerFactoryBean().getObject());

  39. return bean;

  40. }

  41. @Bean

  42. HelloService helloService(){

  43. returnnewHelloService();

  44. }

  45. }

關(guān)于這個(gè)配置說如下幾點(diǎn):

  1. JobDetail 的配置有兩種方式:MethodInvokingJobDetailFactoryBean 和 JobDetailFactoryBean 。
  2. 使用 MethodInvokingJobDetailFactoryBean 可以配置目標(biāo) Bean 的名字和目標(biāo)方法的名字,這種方式不支持傳參。
  3. 使用 JobDetailFactoryBean 可以配置 JobDetail ,任務(wù)類繼承自 QuartzJobBean ,這種方式支持傳參,將參數(shù)封裝在 JobDataMap 中進(jìn)行傳遞。
  4. Trigger 是指觸發(fā)器,Quartz 中定義了多個(gè)觸發(fā)器,這里向大家展示其中兩種的用法,SimpleTrigger 和 CronTrigger 。
  5. SimpleTrigger 有點(diǎn)類似于前面說的 @Scheduled 的基本用法。
  6. CronTrigger 則有點(diǎn)類似于 @Scheduled 中 cron 表達(dá)式的用法。

圖片

全部定義完成后,啟動(dòng) Spring Boot 項(xiàng)目就可以看到定時(shí)任務(wù)的執(zhí)行了。

總結(jié)

這里主要向大家展示了 Spring Boot 中整合兩種定時(shí)任務(wù)的方法,整合成功之后,剩下的用法基本上就和在 SSM 中使用一致了,不再贅述。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    404

    瀏覽量

    17897
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    15081
  • SpringMVC
    +關(guān)注

    關(guān)注

    0

    文章

    18

    瀏覽量

    5974
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Spring Boot如何實(shí)現(xiàn)異步任務(wù)

    Spring Boot 提供了多種方式來實(shí)現(xiàn)異步任務(wù),這里介紹三主要實(shí)現(xiàn)方式。 1、基于注解 @Async @Async 注解是 Spring
    的頭像 發(fā)表于 09-30 10:32 ?1753次閱讀

    Linux系統(tǒng)定時(shí)任務(wù)Crond

    會(huì)定期(默認(rèn)每分鐘檢查一次)檢查系統(tǒng)是否有要執(zhí)行的任務(wù)工作,如果有,便會(huì)根據(jù)其預(yù)先設(shè)定的定時(shí)任務(wù)規(guī)則自動(dòng)執(zhí)行該定時(shí)任務(wù)工作,這個(gè)crond定時(shí)任務(wù)
    發(fā)表于 07-05 06:22

    啟動(dòng)Spring Boot項(xiàng)目應(yīng)用的三種方法

    基礎(chǔ)。我們知道了Spring Boot是個(gè)什么了,那么我們又該如何啟動(dòng)Spring Boot應(yīng)用呢?這里小編給大家推薦常用的三種方法。分別是
    發(fā)表于 01-14 17:33

    busybox用crontab/crond在嵌入式系統(tǒng)添加定時(shí)任務(wù)方法

    busybox 用crontab、crond在嵌入式系統(tǒng)添加定時(shí)任務(wù):參考文檔:在嵌入式系統(tǒng),定時(shí)任務(wù)通過crond和cronttab
    發(fā)表于 12-14 06:40

    Spring Boot定時(shí)任務(wù)的重寫方法

    Spring Boot應(yīng)該是目前最火的java開源框架了,它簡(jiǎn)化了我們創(chuàng)建一個(gè)web服務(wù)的過程,讓我們可以在很短時(shí)間、基本零配置就可以啟動(dòng)一個(gè)web服務(wù)。
    的頭像 發(fā)表于 01-20 17:38 ?2721次閱讀

    SpringBoot如何實(shí)現(xiàn)動(dòng)態(tài)增刪啟停定時(shí)任務(wù)

    兩種方式不能動(dòng)態(tài)添加、刪除、啟動(dòng)、停止任務(wù)。 要實(shí)現(xiàn)動(dòng)態(tài)增刪啟停定時(shí)任務(wù)功能,比較廣泛的做法是集成Quartz框架。但是本人的開發(fā)原則是:在滿足項(xiàng)目需求的情況下,盡量少的依賴其它框架,避免項(xiàng)目過于臃腫
    的頭像 發(fā)表于 09-24 09:49 ?3238次閱讀
    SpringBoot如何實(shí)現(xiàn)動(dòng)態(tài)增刪啟停<b class='flag-5'>定時(shí)任務(wù)</b>

    Python定時(shí)任務(wù)的實(shí)現(xiàn)方式

    在日常工作,我們常常會(huì)用到需要周期性執(zhí)行的任務(wù),一方式是采用 Linux 系統(tǒng)自帶的 crond 結(jié)合命令行實(shí)現(xiàn)。另外一方式是直接使用Python。接下來整理的是常見的Pytho
    的頭像 發(fā)表于 10-08 15:20 ?1w次閱讀

    說說Spring定時(shí)任務(wù)如何大規(guī)模企業(yè)級(jí)運(yùn)用

    定時(shí)任務(wù)是業(yè)務(wù)應(yīng)用開發(fā)中非常普遍存在的場(chǎng)景(如:每分鐘掃描超時(shí)支付的訂單,每小時(shí)清理一次數(shù)據(jù)庫歷史數(shù)據(jù),每天統(tǒng)計(jì)前一天的數(shù)據(jù)并生成報(bào)表等等),解決方案很多,Spring 框架提供了一通過注解來配置
    的頭像 發(fā)表于 11-04 09:36 ?917次閱讀

    求一SpringBoot定時(shí)任務(wù)動(dòng)態(tài)管理通用解決方案

    SpringBoot的定時(shí)任務(wù)的加強(qiáng)工具,實(shí)現(xiàn)對(duì)SpringBoot原生的定時(shí)任務(wù)進(jìn)行動(dòng)態(tài)管理,完全兼容原生@Scheduled注解,無需對(duì)原本的定時(shí)任務(wù)進(jìn)行修改
    的頭像 發(fā)表于 02-03 09:49 ?1025次閱讀

    SpringBoot如何實(shí)現(xiàn)定時(shí)任務(wù)(下)

    SpringBoot創(chuàng)建定時(shí)任務(wù)的方式很簡(jiǎn)單,主要有兩種方式:一、基于注解的方式(@Scheduled)二、數(shù)據(jù)庫動(dòng)態(tài)配置。實(shí)際開發(fā),第一需要在代碼
    的頭像 發(fā)表于 04-07 14:51 ?1429次閱讀
    SpringBoot如何實(shí)現(xiàn)<b class='flag-5'>定時(shí)任務(wù)</b>(下)

    SpringBoot如何實(shí)現(xiàn)定時(shí)任務(wù)(上)

    SpringBoot創(chuàng)建定時(shí)任務(wù)的方式很簡(jiǎn)單,主要有兩種方式:一、基于注解的方式(@Scheduled)二、數(shù)據(jù)庫動(dòng)態(tài)配置。實(shí)際開發(fā),第一需要在代碼
    的頭像 發(fā)表于 04-07 14:51 ?1583次閱讀
    SpringBoot如何實(shí)現(xiàn)<b class='flag-5'>定時(shí)任務(wù)</b>(上)

    Spring Boot如何使用定時(shí)任務(wù)

    本文介紹在 Spring Boot 如何使用定時(shí)任務(wù),使用非常簡(jiǎn)單,就不做過多說明了。
    的頭像 發(fā)表于 04-12 10:56 ?1212次閱讀

    python定時(shí)任務(wù)實(shí)踐

    由于程序需求,監(jiān)測(cè)配置變化需要設(shè)置定時(shí)任務(wù),每分鐘執(zhí)行一次,對(duì)任務(wù)持久化要求不高,不需要時(shí)可以關(guān)閉定時(shí)任務(wù)
    的頭像 發(fā)表于 05-20 17:53 ?1201次閱讀
    python<b class='flag-5'>定時(shí)任務(wù)</b>實(shí)踐

    如何在Spring Boot應(yīng)用程序整合ZXing庫

    在數(shù)字化時(shí)代,二維碼已經(jīng)成為了信息交流的一常見方式。它們被廣泛用于各種應(yīng)用,從產(chǎn)品標(biāo)簽到活動(dòng)傳單,以及電子支付。本文將向您展示如何在Spring Boot應(yīng)用程序
    的頭像 發(fā)表于 12-03 17:39 ?1362次閱讀

    linux定時(shí)任務(wù)的用法總結(jié)

    習(xí)慣了使用 windows 的計(jì)劃任務(wù),使用 linux 的 crontab 管理定時(shí)任務(wù)時(shí)很不適應(yīng)。
    的頭像 發(fā)表于 08-14 18:16 ?1151次閱讀
    linux<b class='flag-5'>定時(shí)任務(wù)</b>的用法總結(jié)