摘要:對于定時任務類如果不定義線程池,控制臺輸出如下,可以看到不同的定時任務是同一個線程在執行在配置類或者啟動類中增加定時任務的線程池控制臺輸出本節示例代碼已上傳到
一.SpringBoot中開啟定時任務
在spirngboot中使用定時任務非常簡單,只需要在啟動類上增加一個@EnableScheduling注解即可。
@SpringBootApplication @EnableScheduling public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
對定時任務的類增加@Component注解,加入Spring的容器管理中
@Component public class ScheduleJob { ...... }
主要有三種定時的方式:
1.fixedRate
該屬性的含義是上一個調用開始后再次調用的延時(不用等待上一次調用完成),這樣就可能會存在任務重復執行的問題,所以不是建議使用,但數據量如果不大時在配置的間隔時間內可以執行完也是可以使用的。配置示例如下圖5所示:
@Scheduled(fixedRate = 1000 * 1) public void fixedRateTask() throws InterruptedException { TimeUnit.SECONDS.sleep(2); System.out.println("執行 fixedRate 任務的時間:" + new Date(System.currentTimeMillis())); }
控制臺輸出:
任務觸發的間隔都是2秒,說明該方法并沒有等到執行完再開始下次執行(如果等待執行完應該需要3秒),而且看起來像一個單線程加隊列的方式在執行。
2.fixedDelay
該屬性的功效與上面的fixedRate則是相反的,配置了該屬性后會等到方法執行完成后延遲配置的時間再次執行該方法。
@Scheduled(fixedDelay = 1000 * 1) public void fixedDelayTask() throws InterruptedException { TimeUnit.SECONDS.sleep(3); System.out.println("執行 fixedDelay 任務的時間:" + new Date(System.currentTimeMillis())); }
控制臺輸出結果:
3.cron表達式
@Scheduled(cron = "0/10 * * * * ?") public void cronTask() { System.out.println("執行 cron 任務的時間:" + new Date(System.currentTimeMillis())); }
控制臺輸出:
默認情況下,如果什么都不進行配置,就會導致一個問題,系統中所有的定時任務都是使用的一個線程去執行的,也就是說,如果如果同一個時刻有2個定時任務需要執行,那么只可能有一個定時任務在執行,如果要解決這個問題可以定義一個自定的任務調度線程池即可。
解決方案:
By default, will be searching for an associated scheduler definition: either a unique {@link org.springframework.scheduling.TaskScheduler} bean in the context, or a {@code TaskScheduler} bean named "taskScheduler" otherwise; the same lookup will also be performed for a {@link java.util.concurrent.ScheduledExecutorService} bean. If neither of the two is resolvable, a local single-threaded default scheduler will be created and used within the registrar.
上面這一段是從org.springframework.scheduling.annotation.EnableScheduling這個注解類上的一段注釋。大致上就是我們定義一個TaskScheduler類型的bean即可解決這個問題。
對于定時任務類:
@Component public class ScheduleTreadTest { @Scheduled(cron = "0/3 * * * * ?") public void task01() { System.out.println(Thread.currentThread().getName() + "----> task01"); } @Scheduled(cron = "0/2 * * * * ?") public void task02() { System.out.println(Thread.currentThread().getName() + "----> task02"); } @Scheduled(cron = "0/3 * * * * ?") public void task03() { System.out.println(Thread.currentThread().getName() + "----> task03"); } }
如果不定義線程池,控制臺輸出如下,可以看到不同的定時任務是同一個線程在執行:
在配置類或者啟動類中增加定時任務的線程池:
控制臺輸出:
本節示例代碼已上傳到github: https://github.com/liaosilzu2...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71043.html
摘要:多線程并發定時任務剛剛看了下實現定時任務的文章,感覺還不錯。存在問題但是后來發現個問題,通過同時測試幾個任務發現,所有的任務都是在同一個線程池中的同一個線程來完成的。 spring-boot | 多線程并發定時任務 剛剛看了下Spring Boot實現定時任務的文章,感覺還不錯。Spring Boot 使用Spring自帶的Schedule來實現定時任務變得非常簡單和方便。在這里個大家...
摘要:當前時間打印當前時間定時任務觸發,操作多個添加數據,事務中任一異常,都可以正常導致數據回滾。當前時間當前時間添加微服務啟動類注解式配置定時任務,不支持任務調度。 SpringCloud(第 046 篇)注解式Schedule配置定時任務,不支持任務調度 - 一、大致介紹 1、很多時候我們需要隔一定的時間去執行某個任務,為了實現這樣的需求通常最普通的方式就是利用多線程來實現; 2、但是有...
摘要:前情提要由于項目需要,需要一個定時任務集群,故此有了這個集群的實踐。數據庫表前綴在被認為失火之前,調度程序將容忍一個將其下一個啟動時間通過的毫秒數。設置此實例檢入與群集的其他實例的頻率以毫秒為單位。影響檢測失敗實例的速度。 【前情提要】由于項目需要,需要一個定時任務集群,故此有了這個spring-boot-starter-quartz集群的實踐。springboot的版本為:2.1.6...
本文將告訴你如何使用spring的任務調度。主要使用@Scheduled注解 需要會使用maven 第一步 pom.xml配置 4.0.0 org.xxz scheduled-task-test 1.0 org.springframework.boot spring-boot-starter-parent ...
摘要:時間年月日星期四說明本文部分內容均來自慕課網。哈希表實現命令,將哈希表中的域的值設為實現命令,返回哈希表中給定域的值實現命令,刪除哈希表中的一個或多個指定域,不存在的域將被忽略。實現命令,返回哈希表中,所有的域和值。 時間:2018年04月19日星期四說明:本文部分內容均來自慕課網。@慕課網:https://www.imooc.com教學源碼:https://github.com/zc...
閱讀 2112·2023-04-26 00:41
閱讀 1142·2021-09-24 10:34
閱讀 3573·2021-09-23 11:21
閱讀 4031·2021-09-22 15:06
閱讀 1557·2019-08-30 15:55
閱讀 898·2019-08-30 15:54
閱讀 1829·2019-08-30 15:48
閱讀 550·2019-08-29 13:58