Spring Boot定時(shí)任務(wù)單線程多線程實(shí)現(xiàn)代碼解析
1、創(chuàng)建定時(shí)任務(wù):
@Component public class AutoNotifyController { /** * 獲取RedisUtils注入的bean * * @return */ private ThreadUtil getThreadUtil() { ThreadUtil threadUtil = SpringContextUtil.getBean("threadUtil"); return threadUtil; } /** * @描述: 推送啟動(dòng)充電結(jié)果的自動(dòng)獲取和處理分發(fā)方法 * @輸入值: void * @返回值: void */ @Scheduled(cron = "*/5 * * * * ?") public void AutoNotifyStartChargeResult() { getThreadUtil().AutoNotifyStartChargeResult(); } /** * @描述: 推送充電狀態(tài)的自動(dòng)獲取和處理分發(fā)方法 * @輸入值: void * @返回值: void */ @Scheduled(cron = "*/50 * * * * ?") public void AutoNotifyChargeStatus() { getThreadUtil().AutoNotifyChargeStatus(); } /** * @描述: 推送停止充電結(jié)果的自動(dòng)獲取和處理分發(fā)方法 * @輸入值: void * @返回值: void */ @Scheduled(cron = "*/5 * * * * ?") public void AutoNotifyStopChargeResult() { getThreadUtil().AutoNotifyStopChargeResult(); } /** * @描述: 推送訂單信息的自動(dòng)獲取和處理分發(fā)方法 * @輸入值: void * @返回值: void */ @Scheduled(cron = "*/5 * * * * ?") public void AutoNotifyOrderInfo() { getThreadUtil().AutoNotifyOrderInfo(); } /** * @描述: 公共信息部分的設(shè)備狀態(tài)變化推送接口的自動(dòng)獲取和處理分發(fā)方法 * @輸入值: void * @返回值: void */ @Scheduled(fixedRate = 200) public void checkGunStatus() { getThreadUtil().checkGunStatus(); } /** * @描述: 對(duì)于Redis中的活躍訂單增加和刪除的輪詢執(zhí)行方法 */ @Scheduled(cron = "*/5 * * * * ?") public void ActiveOrderAddAndDelete() { getThreadUtil().ActiveOrderAddAndDelete(); } /** * @描述: 對(duì)于Redis中的結(jié)束訂單訂單增加和刪除的輪詢執(zhí)行方法 */ @Scheduled(cron = "*/5 * * * * ?") public void EndOrderAddAndDelete() { getThreadUtil().EndOrderAddAndDelete(); } }
使用 @Scheduled來創(chuàng)建定時(shí)任務(wù) 這個(gè)注解用來標(biāo)注一個(gè)定時(shí)任務(wù)方法。
通過看 @Scheduled源碼可以看出它支持多種參數(shù):
(1)cron:cron表達(dá)式,指定任務(wù)在特定時(shí)間執(zhí)行;
(2)fixedDelay:表示上一次任務(wù)執(zhí)行完成后多久再次執(zhí)行,參數(shù)類型為long,單位ms;
(3)fixedDelayString:與fixedDelay含義一樣,只是參數(shù)類型變?yōu)镾tring;
(4)fixedRate:表示按一定的頻率執(zhí)行任務(wù),參數(shù)類型為long,單位ms;
(5)fixedRateString: 與fixedRate的含義一樣,只是將參數(shù)類型變?yōu)镾tring;
(6)initialDelay:表示延遲多久再第一次執(zhí)行任務(wù),參數(shù)類型為long,單位ms;
(7)initialDelayString:與initialDelay的含義一樣,只是將參數(shù)類型變?yōu)镾tring;
(8)zone:時(shí)區(qū),默認(rèn)為當(dāng)前時(shí)區(qū),一般沒有用到。
2、開啟定時(shí)任務(wù):
@SpringBootApplication @EnableScheduling public class PositivebuttjointApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(PositivebuttjointApplication.class, args); }
注:這里的 @EnableScheduling 注解,它的作用是發(fā)現(xiàn)注解 @Scheduled的任務(wù)并由后臺(tái)執(zhí)行。沒有它的話將無法執(zhí)行定時(shí)任務(wù)。
引用官方文檔原文:
@EnableScheduling ensures that a background task executor is created. Without it, nothing gets scheduled.
3、執(zhí)行結(jié)果(單線程)
就完成了一個(gè)簡(jiǎn)單的定時(shí)任務(wù)模型,下面執(zhí)行springBoot觀察執(zhí)行結(jié)果:
從控制臺(tái)輸入的結(jié)果中我們可以看出所有的定時(shí)任務(wù)都是在同一個(gè)線程池用同一個(gè)線程來處理的,那么我們?nèi)绾蝸聿l(fā)的處理各定時(shí)任務(wù)呢,請(qǐng)繼續(xù)向下看。
4、多線程處理定時(shí)任務(wù):
1.開啟多線程
@SpringBootApplication @EnableScheduling @EnableAsync public class PositivebuttjointApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(PositivebuttjointApplication.class, args); }
加入@EnableAsync開啟多線程
2.使用多線程
@Async public void AutoNotifyStartChargeResult() { }
調(diào)用的方法上加上@Async使用多線程
3.配置連接池
@Configuration public class ScheduleConfiguration implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.setScheduler(this.getTaskScheduler()); } private ThreadPoolTaskScheduler getTaskScheduler() { ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); taskScheduler.setPoolSize(20); taskScheduler.setThreadNamePrefix("schedule-pool-"); taskScheduler.initialize(); return taskScheduler; } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- SpringBoot定時(shí)任務(wù)參數(shù)運(yùn)行代碼實(shí)例解析
- SpringBoot整合SpringTask實(shí)現(xiàn)定時(shí)任務(wù)的流程
- Spring Boot @Scheduled定時(shí)任務(wù)代碼實(shí)例解析
- Spring boot基于ScheduledFuture實(shí)現(xiàn)定時(shí)任務(wù)
- SpringBoot集成Quartz實(shí)現(xiàn)定時(shí)任務(wù)的方法
- Spring Boot監(jiān)聽Redis Key失效事件實(shí)現(xiàn)定時(shí)任務(wù)的示例
- springboot實(shí)現(xiàn)多實(shí)例crontab搶占定時(shí)任務(wù)(實(shí)例代碼)
- SpringBoot基于數(shù)據(jù)庫的定時(shí)任務(wù)統(tǒng)一管理的實(shí)現(xiàn)
相關(guān)文章
Java 最重要布局管理器GridBagLayout的使用方法
GridBagLayout是java里面最重要的布局管理器之一,可以做出很復(fù)雜的布局,可以說GridBagLayout是必須要學(xué)好的的,需要的朋友可以了解下2012-12-12Java發(fā)送報(bào)文與接收?qǐng)?bào)文的實(shí)例代碼
這篇文章主要介紹了Java發(fā)送報(bào)文與接收?qǐng)?bào)文,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Java實(shí)現(xiàn)雪花算法(snowflake)
這篇文章主要介紹了Java實(shí)現(xiàn)雪花算法(snowflake),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08詳解JAVA生成將圖片存入數(shù)據(jù)庫的sql語句實(shí)現(xiàn)方法
這篇文章主要介紹了詳解JAVA生成將圖片存入數(shù)據(jù)庫的sql語句實(shí)現(xiàn)方法的相關(guān)資料,這里就是實(shí)現(xiàn)java生成圖片并存入數(shù)據(jù)庫的實(shí)例,需要的朋友可以參考下2017-08-08Spring中使用Hystrix實(shí)現(xiàn)熔斷詳解
這篇文章主要介紹了Java中使用Hystrix實(shí)現(xiàn)熔斷詳解,對(duì)于第一個(gè)問題,查看hystrix源碼可以看到,如果有緩存配置是優(yōu)先使用的緩存的,因此如果配置更新,必須要更新緩存,不能使用Hystrix.reset()方法來更新緩存,需要的朋友可以參考下2023-12-12