您好,登錄后才能下訂單哦!
這篇文章主要講解了“如何理解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é)
語(yǔ)法:秒 分 時(shí) 日 月 周 年
(其中“年”Spring不支持,也就是說(shuō)在spring定時(shí)任務(wù)中只能設(shè)置:秒 分 時(shí) 日 月 周)
@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ù)器資源耗盡。
當(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)注!
免責(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)容。