Java spring定時(shí)任務(wù)詳解
一、定時(shí)任務(wù)
1、cron表達(dá)式
語法:秒 分 時(shí) 日 月 周 年
(其中“年”Spring不支持,也就是說在spring定時(shí)任務(wù)中只能設(shè)置:秒 分 時(shí) 日 月 周)
2、cron示例
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 開啟定時(shí)任務(wù) * 2、@Scheduled開啟一個(gè)定時(shí)任務(wù) * * 異步任務(wù) * 1、@EnableAsync:開啟異步任務(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ù)以異步的方式,自己提交到線程池 * CompletableFuture.runAsync(() -> { * },execute); * * 2)、支持定時(shí)任務(wù)線程池;設(shè)置 TaskSchedulingProperties * spring.task.scheduling.pool.size: 5 * * 3)、讓定時(shí)任務(wù)異步執(zhí)行 * 異步任務(wù) * * 解決:使用異步任務(wù) + 定時(shí)任務(wù)來完成定時(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)是阻塞的線程,也就是說即使你設(shè)置成每一秒執(zhí)行一次,但是方法內(nèi)部的業(yè)務(wù)時(shí)間需要5秒才能執(zhí)行完,也會(huì)造成定時(shí)任務(wù)每6秒才能執(zhí)行一次。
當(dāng)然我們可以開啟異步線程:
@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 開啟定時(shí)任務(wù) * 2、@Scheduled開啟一個(gè)定時(shí)任務(wù) * * 異步任務(wù) * 1、@EnableAsync:開啟異步任務(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ù)以異步的方式,自己提交到線程池 * CompletableFuture.runAsync(() -> { * },execute); * * 2)、支持定時(shí)任務(wù)線程池;設(shè)置 TaskSchedulingProperties * spring.task.scheduling.pool.size: 5 * * 3)、讓定時(shí)任務(wù)異步執(zhí)行 * 異步任務(wù) * * 解決:使用異步任務(wù) + 定時(shí)任務(wù)來完成定時(shí)任務(wù)不阻塞的功能 * */ @Async @Scheduled(cron = "*/1 * * * * ?") public void hello() { log.info("hello..."); try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } } }
這樣就會(huì)開啟異步線程,并且是非阻塞線程,因?yàn)槊看味紩?huì)開啟一個(gè)線程來執(zhí)行,我們可以看一下源碼配置的截圖,這個(gè)就是異步執(zhí)行的默認(rèn)配置,核心線程數(shù)是8,最大線程數(shù)是無限大,這時(shí)如果一直每秒執(zhí)行一次,則會(huì)造成服務(wù)器資源耗盡。
當(dāng)然,我們可以在配置文件中進(jìn)行定時(shí)任務(wù)線程池的設(shè)定:
#核心線程數(shù)
spring.task.execution.pool.core-size=20
#最大線程數(shù)
spring.task.execution.pool.max-size=50
#隊(duì)列大小
spring.task.execution.pool.queue-capacity=10000
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
- Java?@Scheduled定時(shí)任務(wù)不執(zhí)行解決辦法
- Java實(shí)現(xiàn)定時(shí)任務(wù)的方法總結(jié)
- Java使用quartz實(shí)現(xiàn)定時(shí)任務(wù)示例詳解
- Java實(shí)現(xiàn)定時(shí)任務(wù)最簡(jiǎn)單的3種方法
- Java項(xiàng)目實(shí)現(xiàn)定時(shí)任務(wù)的三種方法
- java定時(shí)任務(wù)cron表達(dá)式每周執(zhí)行一次的坑及解決
- Java使用線程池執(zhí)行定時(shí)任務(wù)
- Java中定時(shí)任務(wù)的6種實(shí)現(xiàn)方式
- Java 實(shí)現(xiàn)定時(shí)任務(wù)的三種方法
- java使用@Scheduled注解執(zhí)行定時(shí)任務(wù)
- Java定時(shí)任務(wù)取消的示例代碼
相關(guān)文章
mybatis連接mysql的實(shí)現(xiàn)過程
通過配置Maven的pom文件,可以簡(jiǎn)化MyBatis連接數(shù)據(jù)庫(kù)的過程,免去手動(dòng)下載和導(dǎo)入各種依賴包的麻煩,本文介紹了如何利用Maven導(dǎo)入MyBatis及其他相關(guān)依賴,如Junit、MySQL連接驅(qū)動(dòng)、Druid連接池和Dbutil等,以簡(jiǎn)化數(shù)據(jù)庫(kù)操作和測(cè)試2024-10-10java isInterrupted()判斷線程的實(shí)例講解
在本篇內(nèi)容里小編給大家分享的是一篇關(guān)于java isInterrupted()判斷線程的實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-05-05如何解決Maven出現(xiàn)Could not find artifact的問題
這篇文章主要介紹了如何解決Maven出現(xiàn)Could not find artifact的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04SpringBoot整合SpringSession實(shí)現(xiàn)分布式登錄詳情
這篇文章主要介紹了SpringBoot整合SpringSession實(shí)現(xiàn)分布式登錄詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08在spring?boot3中使用native?image的最新方法
這篇文章主要介紹了在spring?boot3中使用native?image?,今天我們用具體的例子來給大家演示一下如何正確的將spring boot3的應(yīng)用編譯成為native image,需要的朋友可以參考下2023-01-01Java簡(jiǎn)單實(shí)現(xiàn)session保存到redis的方法示例
這篇文章主要介紹了Java簡(jiǎn)單實(shí)現(xiàn)session保存到redis的方法,結(jié)合實(shí)例形式分析了Java將session存入redis緩存服務(wù)器的相關(guān)設(shè)置、實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下2018-05-05