溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何理解Java spring定時(shí)任務(wù)

發(fā)布時(shí)間:2021-10-08 09:37:28 來(lái)源:億速云 閱讀:141 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要講解了“如何理解Java spring定時(shí)任務(wù)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“如何理解Java spring定時(shí)任務(wù)”吧!

目錄
  • 一、定時(shí)任務(wù)

    • 1、cron表達(dá)式

    • 2、cron示例

    • 3、SpringBoot整合

  • 總結(jié)

    一、定時(shí)任務(wù)

    1、cron表達(dá)式

    語(yǔ)法:秒 分 時(shí) 日 月 周 年

    (其中“年”Spring不支持,也就是說(shuō)在spring定時(shí)任務(wù)中只能設(shè)置:秒 分 時(shí) 日 月 周)

    如何理解Java spring定時(shí)任務(wù)

    如何理解Java spring定時(shí)任務(wù)

    2、cron示例

    如何理解Java spring定時(shí)任務(wù)

    如何理解Java spring定時(shí)任務(wù)

    3、SpringBoot整合

    @EnableScheduling

    @Scheduled

    實(shí)例:

    package com.xunqi.gulimall.seckill.scheduled;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.scheduling.annotation.Async;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    import java.util.concurrent.TimeUnit;
    /**
     * @Description:
     * @Created: with IntelliJ IDEA.
     * @author: 夏沫止水
     * @createTime: 2020-07-09 18:49
     **/
    /**
     * 定時(shí)任務(wù)
     *      1、@EnableScheduling 開(kāi)啟定時(shí)任務(wù)
     *      2、@Scheduled開(kāi)啟一個(gè)定時(shí)任務(wù)
     *
     * 異步任務(wù)
     *      1、@EnableAsync:開(kāi)啟異步任務(wù)
     *      2、@Async:給希望異步執(zhí)行的方法標(biāo)注
     */
    @Slf4j
    @Component
    @EnableScheduling
    public class HelloScheduled {
        /**
         * 1、在Spring中表達(dá)式是6位組成,不允許第七位的年份
         * 2、在周幾的的位置,1-7代表周一到周日
         * 3、定時(shí)任務(wù)不該阻塞。默認(rèn)是阻塞的
         *      1)、可以讓業(yè)務(wù)以異步的方式,自己提交到線(xiàn)程池
         *              CompletableFuture.runAsync(() -> {
         *         },execute);
         *
         *      2)、支持定時(shí)任務(wù)線(xiàn)程池;設(shè)置 TaskSchedulingProperties
         *        spring.task.scheduling.pool.size: 5
         *
         *      3)、讓定時(shí)任務(wù)異步執(zhí)行
         *          異步任務(wù)
         *
         *      解決:使用異步任務(wù) + 定時(shí)任務(wù)來(lái)完成定時(shí)任務(wù)不阻塞的功能
         *
         */
         @Scheduled(cron = "*/1 * * * * ?")
         public void hello() {
             log.info("hello...");
             try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }
         }
    }

    定時(shí)任務(wù)默認(rèn)是阻塞的線(xiàn)程,也就是說(shuō)即使你設(shè)置成每一秒執(zhí)行一次,但是方法內(nèi)部的業(yè)務(wù)時(shí)間需要5秒才能執(zhí)行完,也會(huì)造成定時(shí)任務(wù)每6秒才能執(zhí)行一次。

    當(dāng)然我們可以開(kāi)啟異步線(xiàn)程:

    @EnableAsync

    @Async

    實(shí)例:

    package com.xunqi.gulimall.seckill.scheduled;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.scheduling.annotation.Async;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    import java.util.concurrent.TimeUnit;
    /**
     * @Description:
     * @Created: with IntelliJ IDEA.
     * @author: 夏沫止水
     * @createTime: 2020-07-09 18:49
     **/
    /**
     * 定時(shí)任務(wù)
     *      1、@EnableScheduling 開(kāi)啟定時(shí)任務(wù)
     *      2、@Scheduled開(kāi)啟一個(gè)定時(shí)任務(wù)
     *
     * 異步任務(wù)
     *      1、@EnableAsync:開(kāi)啟異步任務(wù)
     *      2、@Async:給希望異步執(zhí)行的方法標(biāo)注
     */
    @Slf4j
    @Component
    @EnableAsync
    @EnableScheduling
    public class HelloScheduled {
        /**
         * 1、在Spring中表達(dá)式是6位組成,不允許第七位的年份
         * 2、在周幾的的位置,1-7代表周一到周日
         * 3、定時(shí)任務(wù)不該阻塞。默認(rèn)是阻塞的
         *      1)、可以讓業(yè)務(wù)以異步的方式,自己提交到線(xiàn)程池
         *              CompletableFuture.runAsync(() -> {
         *         },execute);
         *
         *      2)、支持定時(shí)任務(wù)線(xiàn)程池;設(shè)置 TaskSchedulingProperties
         *        spring.task.scheduling.pool.size: 5
         *
         *      3)、讓定時(shí)任務(wù)異步執(zhí)行
         *          異步任務(wù)
         *
         *      解決:使用異步任務(wù) + 定時(shí)任務(wù)來(lái)完成定時(shí)任務(wù)不阻塞的功能
         *
         */
         @Async
         @Scheduled(cron = "*/1 * * * * ?")
         public void hello() {
             log.info("hello...");
             try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }
         }
    }

    這樣就會(huì)開(kāi)啟異步線(xiàn)程,并且是非阻塞線(xiàn)程,因?yàn)槊看味紩?huì)開(kāi)啟一個(gè)線(xiàn)程來(lái)執(zhí)行,我們可以看一下源碼配置的截圖,這個(gè)就是異步執(zhí)行的默認(rèn)配置,核心線(xiàn)程數(shù)是8,最大線(xiàn)程數(shù)是無(wú)限大,這時(shí)如果一直每秒執(zhí)行一次,則會(huì)造成服務(wù)器資源耗盡。

    如何理解Java spring定時(shí)任務(wù)

    當(dāng)然,我們可以在配置文件中進(jìn)行定時(shí)任務(wù)線(xiàn)程池的設(shè)定:

    #核心線(xiàn)程數(shù)

    spring.task.execution.pool.core-size=20

    #最大線(xiàn)程數(shù)

    spring.task.execution.pool.max-size=50

    #隊(duì)列大小

    spring.task.execution.pool.queue-capacity=10000

    感謝各位的閱讀,以上就是“如何理解Java spring定時(shí)任務(wù)”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)如何理解Java spring定時(shí)任務(wù)這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI