成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Spring定時任務(wù)高級使用篇

dcr309duan / 2275人閱讀

摘要:定時任務(wù)高級使用篇前面一篇博文之定時任務(wù)基本使用篇介紹了環(huán)境下,定時任務(wù)的簡單使用姿勢,也留了一些問題,這一篇則希望能針對這些問題給個答案定時任務(wù)進階篇問題小結(jié)前面一篇博文,拋出了下面的幾個問題,接下來則圍繞問題進行分析一個項目中有多個定時

Spring定時任務(wù)高級使用篇

前面一篇博文 《Spring之定時任務(wù)基本使用篇》 介紹了Spring環(huán)境下,定時任務(wù)的簡單使用姿勢,也留了一些問題,這一篇則希望能針對這些問題給個答案

I. 定時任務(wù)進階篇 1. 問題小結(jié)

前面一篇博文,拋出了下面的幾個問題,接下來則圍繞問題進行分析

一個項目中有多個定時任務(wù)時,他們是并行執(zhí)行的還是串行執(zhí)行的?

如果默認(rèn)是串行的

那么有相同的crond表達式的定時任務(wù)之間,有先后順序么?

某個任務(wù)的阻塞是否會影響后面的任務(wù)?

如果需要他們并行執(zhí)行,可以怎么做?

如果是并發(fā)執(zhí)行的

是新創(chuàng)建線程還是采用線程池來復(fù)用呢?

在并發(fā)執(zhí)行時,假設(shè)有個每秒執(zhí)行一次的任務(wù),但是它執(zhí)行一次消耗的時間大于1s時,這個任務(wù)的表現(xiàn)時怎樣的呢?不斷地新增線程來執(zhí)行還是等執(zhí)行完畢之后再執(zhí)行下一次的呢?

2. 多定時任務(wù)的串并行分析

如何確認(rèn)一個項目中的多個定時任務(wù)是串行執(zhí)行還是并發(fā)執(zhí)行呢?要想驗證這個功能,最好的法子就是寫個testcase,比如定義兩個定時任務(wù),在其中一個任務(wù)中寫個死循環(huán),看另外一個任務(wù)是否會正常執(zhí)行

@Scheduled(cron = "0/1 * * * * ?")
public void sc1() throws InterruptedException {
    System.out.println(Thread.currentThread().getName() + " | sc1 " + System.currentTimeMillis());
    while (true) {
        Thread.sleep(5000);
    }
}

@Scheduled(cron = "0/1 * * * * ?")
public void sc2() {
    System.out.println(Thread.currentThread().getName() + " | sc2 " + System.currentTimeMillis());
}

首先我們分析的是 sc1和sc2這兩個任務(wù)的執(zhí)行是串行還是并行的,暫時先不考慮 sc1 調(diào)用時阻塞,下一秒是否是開新的線程再調(diào)用sc1

若串行:則sc1打印一次,sc2可能打印0或者1次

若并行:sc1打印一次,sc2打印n多次

實際運行,GIF圖演示如下

上圖的結(jié)果,印證了默認(rèn)的情況下,多個定時任務(wù)時串行執(zhí)行的;如果一個任務(wù)出現(xiàn)阻塞,其他的任務(wù)都會受到影響

3. 定時任務(wù)執(zhí)行的優(yōu)先級

既然是順序執(zhí)行的,那么優(yōu)先級怎么定?每次都是固定的,還是隨機的呢?

要驗證上面的方法,也容易,同樣兩個任務(wù),看他們的輸出是否會亂掉,如果每次都是任務(wù)1打印完再打印任務(wù)2,那就是固定優(yōu)先級的;否則每次調(diào)度時,順序不好說

測試代碼如下

@Scheduled(cron = "0/1 * * * * ?")
public void sc1()  {
    System.out.println(Thread.currentThread().getName() + " | sc1 " + System.currentTimeMillis());
}

@Scheduled(cron = "0/1 * * * * ?")
public void sc2() {
    System.out.println(Thread.currentThread().getName() + " | sc2 " + System.currentTimeMillis());
}

實測結(jié)果如下

從輸出得出結(jié)論:順序是串掉的,并沒有表現(xiàn)出明顯的優(yōu)先級關(guān)系

4. 并行調(diào)度

接下來的問題就是我希望這些任務(wù)可以并發(fā)執(zhí)行,可以實現(xiàn)么?

當(dāng)然是可以,用起來也比較簡單,首先是在Application上添加注解@EnableAsync,開啟異步調(diào)用,然后再計劃任務(wù)上加上@Async注解即可,一個簡單的demo如下

@EnableAsync
@EnableScheduling
@SpringBootApplication
public class QuickMediaApplication {

    public static void main(String[] args) {
        SpringApplication.run(QuickMediaApplication.class, args);
    }

    @Scheduled(cron = "0/1 * * * * ?")
    @Async
    public void sc1()  {
        System.out.println(Thread.currentThread().getName() + " | sc1 " + System.currentTimeMillis());
    }
}

上面執(zhí)行之后,查看輸出(異步調(diào)度時,理論上線程名應(yīng)該不一樣)

從上面的輸出,可以簡單的推理,每次調(diào)度上面的任務(wù)都是新開了一個線程來做的,所以如果在定時任務(wù)中寫了死循環(huán),是否會導(dǎo)致無限線程,最后整個進程崩掉?

額外提一句,linux系統(tǒng)下單進程的線程數(shù)是有上線的,查看命令為:

ulimit -u

在測試之前,先看下上面的正常任務(wù)執(zhí)行,如下面的動圖,線程數(shù)并沒有夸張的長法

接下來換成死循環(huán)的調(diào)度方式,實際測試如下,線程數(shù)蹭蹭的上漲

所以使用默認(rèn)的異步調(diào)用方式,并不是一個好注意,說不準(zhǔn)就被玩死了自己都不知道,那么可以用自己的線程池來管理這些異步任務(wù)么?

5. 自定義線程池

用自定義的線程池來取代默認(rèn)線程管理方式,無疑是一個更加安全和靈活的方式,使用起來也并不麻煩,和平常創(chuàng)建線程池的套路沒什么區(qū)別,要在Spring生態(tài)中使用,就把它搞成bean即可

直接借助Spring的線程池ThreadPoolTaskExecutor

@Bean
public AsyncTaskExecutor asyncTaskExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setThreadNamePrefix("yhh-schedule-");
    executor.setMaxPoolSize(10);
    executor.setCorePoolSize(3);
    executor.setQueueCapacity(0);
    executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
    return executor;
}

@Scheduled(cron = "0/1 * * * * ?")
@Async
public void sc1() throws InterruptedException {
    System.out.println(Thread.currentThread().getName() + " | sc1 " + System.currentTimeMillis());
    while (true) {
        Thread.sleep(1000 * 5);
    }
}

實際演示的結(jié)果如下,最多10個線程,再提交的任務(wù)直接丟棄

簡單說一下,用自定義線程池的好處:

合理的分配線程池參數(shù)

拒絕策略的選擇也比較有意思(可以按照自己的想法來處理"負(fù)載"的任務(wù))

線程池命名,對于以后問題排查,會有很大的幫助

6. 小結(jié)

本來這篇博文在昨天即8月2號就應(yīng)該寫完的,結(jié)果晚上生產(chǎn)環(huán)境下除了點問題,解決線上故障之后就比較晚了,留到了今天,哎,拖延癥也是要不得。。。

下面小結(jié)Spring中定時任務(wù)的幾個知識點

默認(rèn)所有的定時任務(wù)都是串行調(diào)度的,一個線程,且即便crond完全相同的兩個任務(wù)先后順序也沒法保證(具體原因需要源碼分析,看下這塊是怎么支持)

使用@Async注解可以使定時任務(wù)異步調(diào)度;但是需要開啟配置,在啟動類上添加 @EnableAsync 注解

開啟并發(fā)執(zhí)行時,推薦用自定義的線程池來替代默認(rèn)的,理由見上面

II. 其他 0. 相關(guān)

《Spring之定時任務(wù)基本使用篇》

1. 一灰灰Blog: https://liuyueyi.github.io/he...

一灰灰的個人博客,記錄所有學(xué)習(xí)和工作中的博文,歡迎大家前去逛逛

2. 聲明

盡信書則不如,已上內(nèi)容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發(fā)現(xiàn)bug或者有更好的建議,歡迎批評指正,不吝感激

微博地址: 小灰灰Blog

QQ: 一灰灰/3302797840

3. 掃描關(guān)注

小灰灰Blog&公眾號

知識星球

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76625.html

相關(guān)文章

  • Spring定時任務(wù)基本使用

    摘要:表示起始時間開始觸發(fā),然后每隔固定時間觸發(fā)一次如在域使用則意味著分鐘觸發(fā)一次,而,等分別觸發(fā)一次表示列出枚舉值值。 showImg(https://segmentfault.com/img/remote/1460000015852353); 文章鏈接:https://liuyueyi.github.io/hexblog/2018/08/01/180801-Spring之定時任務(wù)基本使用...

    Jingbin_ 評論0 收藏0
  • Java 定時任務(wù)系列(2)-Spring 定時任務(wù)的幾種實現(xiàn)

    本文來自網(wǎng)絡(luò)一些博客的整理(包括gong1208的博客 dary1715的博客) 1、簡介 這個系列介紹Spring框架實現(xiàn)定時任務(wù)的兩種方式以及一些高級的用法,包括: 1、使用Quartz,這是一個功能比較強大的的調(diào)度器,可以讓你的程序在指定時間執(zhí)行,也可以按照某一個頻度執(zhí)行,配置起來稍顯復(fù)雜,稍后會詳細(xì)介紹。 2、Spring3.0以后自帶的task,可以將它看成一個輕量級的Quartz,而且...

    roadtogeek 評論0 收藏0
  • SpringCloud(第 046 )注解式Schedule配置定時任務(wù),不支持任務(wù)調(diào)度

    摘要:當(dāng)前時間打印當(dāng)前時間定時任務(wù)觸發(fā),操作多個添加數(shù)據(jù),事務(wù)中任一異常,都可以正常導(dǎo)致數(shù)據(jù)回滾。當(dāng)前時間當(dāng)前時間添加微服務(wù)啟動類注解式配置定時任務(wù),不支持任務(wù)調(diào)度。 SpringCloud(第 046 篇)注解式Schedule配置定時任務(wù),不支持任務(wù)調(diào)度 - 一、大致介紹 1、很多時候我們需要隔一定的時間去執(zhí)行某個任務(wù),為了實現(xiàn)這樣的需求通常最普通的方式就是利用多線程來實現(xiàn); 2、但是有...

    masturbator 評論0 收藏0
  • Spring 定時任務(wù)

    摘要:在定時器接口的方法中我們可以發(fā)現(xiàn)一個方法接受接口,而也是一個接口,抽象了觸發(fā)任務(wù)執(zhí)行的觸發(fā)器。更常用的一個觸發(fā)器是,它使用表達式指定何時執(zhí)行任務(wù)。配置定時任務(wù)首先看看配置。配置提供了命名空間,讓配置定時任務(wù)非常簡單。 本文參考自Spring官方文檔 34. Task Execution and Scheduling。 在程序中常常有定時任務(wù)的需求,例如每隔一周生成一次報表、每個月月末清...

    justCoding 評論0 收藏0
  • SpringCloud(第 009 )簡單 Quartz 微服務(wù),不支持分布式

    摘要:添加任務(wù)成功運行任務(wù)名稱添加定時任務(wù)服務(wù)定時任務(wù)服務(wù)。觸發(fā)器計劃列表添加測試任務(wù)類測試任務(wù)類被任務(wù)調(diào)度后執(zhí)行該任務(wù)類。聲明一個靜態(tài)變量保存添加啟動類簡單微服務(wù),不支持分布式。 SpringCloud(第 009 篇)簡單 Quartz 微服務(wù),不支持分布式 - 一、大致介紹 1、本章節(jié)僅僅只是為了測試 Quartz 在微服務(wù)中的使用情況; 2、其實若只是簡單的實現(xiàn)任務(wù)調(diào)用而言的話,Sp...

    awkj 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<