您好,登錄后才能下訂單哦!
這篇文章主要講解了“如何理解Java spring定時任務”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何理解Java spring定時任務”吧!
一、定時任務
1、cron表達式
2、cron示例
3、SpringBoot整合
總結
語法:秒 分 時 日 月 周 年
(其中“年”Spring不支持,也就是說在spring定時任務中只能設置:秒 分 時 日 月 周)
@EnableScheduling
@Scheduled
實例:
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 **/ /** * 定時任務 * 1、@EnableScheduling 開啟定時任務 * 2、@Scheduled開啟一個定時任務 * * 異步任務 * 1、@EnableAsync:開啟異步任務 * 2、@Async:給希望異步執行的方法標注 */ @Slf4j @Component @EnableScheduling public class HelloScheduled { /** * 1、在Spring中表達式是6位組成,不允許第七位的年份 * 2、在周幾的的位置,1-7代表周一到周日 * 3、定時任務不該阻塞。默認是阻塞的 * 1)、可以讓業務以異步的方式,自己提交到線程池 * CompletableFuture.runAsync(() -> { * },execute); * * 2)、支持定時任務線程池;設置 TaskSchedulingProperties * spring.task.scheduling.pool.size: 5 * * 3)、讓定時任務異步執行 * 異步任務 * * 解決:使用異步任務 + 定時任務來完成定時任務不阻塞的功能 * */ @Scheduled(cron = "*/1 * * * * ?") public void hello() { log.info("hello..."); try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } } }
定時任務默認是阻塞的線程,也就是說即使你設置成每一秒執行一次,但是方法內部的業務時間需要5秒才能執行完,也會造成定時任務每6秒才能執行一次。
當然我們可以開啟異步線程:
@EnableAsync
@Async
實例:
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 **/ /** * 定時任務 * 1、@EnableScheduling 開啟定時任務 * 2、@Scheduled開啟一個定時任務 * * 異步任務 * 1、@EnableAsync:開啟異步任務 * 2、@Async:給希望異步執行的方法標注 */ @Slf4j @Component @EnableAsync @EnableScheduling public class HelloScheduled { /** * 1、在Spring中表達式是6位組成,不允許第七位的年份 * 2、在周幾的的位置,1-7代表周一到周日 * 3、定時任務不該阻塞。默認是阻塞的 * 1)、可以讓業務以異步的方式,自己提交到線程池 * CompletableFuture.runAsync(() -> { * },execute); * * 2)、支持定時任務線程池;設置 TaskSchedulingProperties * spring.task.scheduling.pool.size: 5 * * 3)、讓定時任務異步執行 * 異步任務 * * 解決:使用異步任務 + 定時任務來完成定時任務不阻塞的功能 * */ @Async @Scheduled(cron = "*/1 * * * * ?") public void hello() { log.info("hello..."); try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } } }
這樣就會開啟異步線程,并且是非阻塞線程,因為每次都會開啟一個線程來執行,我們可以看一下源碼配置的截圖,這個就是異步執行的默認配置,核心線程數是8,最大線程數是無限大,這時如果一直每秒執行一次,則會造成服務器資源耗盡。
當然,我們可以在配置文件中進行定時任務線程池的設定:
#核心線程數
spring.task.execution.pool.core-size=20
#最大線程數
spring.task.execution.pool.max-size=50
#隊列大小
spring.task.execution.pool.queue-capacity=10000
感謝各位的閱讀,以上就是“如何理解Java spring定時任務”的內容了,經過本文的學習后,相信大家對如何理解Java spring定時任務這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。