javascript
Spring Boot 如何解决多个定时任务阻塞问题?
大家好,我是不才磊哥~
最近長(zhǎng)文擼多了,有點(diǎn)累,今天來(lái)點(diǎn)簡(jiǎn)單的。
今天這篇文章介紹一下Spring Boot 中 如何開(kāi)啟多線程定時(shí)任務(wù)?
為什么Spring Boot 定時(shí)任務(wù)是單線程的?
想要解釋為什么,一定要從源碼入手,直接從@EnableScheduling這個(gè)注解入手,找到了這個(gè)ScheduledTaskRegistrar類,其中有一段代碼如下:
protected?void?scheduleTasks()?{if?(this.taskScheduler?==?null)?{this.localExecutor?=?Executors.newSingleThreadScheduledExecutor();this.taskScheduler?=?new?ConcurrentTaskScheduler(this.localExecutor);} }如果taskScheduler為null,則創(chuàng)建單線程的線程池:Executors.newSingleThreadScheduledExecutor()。
多線程定時(shí)任務(wù)如何配置?
下面介紹三種方案配置多線程下的定時(shí)任務(wù)。
1、重寫SchedulingConfigurer#configureTasks()
直接實(shí)現(xiàn)SchedulingConfigurer這個(gè)接口,設(shè)置taskScheduler,代碼如下:
@Configuration public?class?ScheduleConfig?implements?SchedulingConfigurer?{@Overridepublic?void?configureTasks(ScheduledTaskRegistrar?taskRegistrar)?{//設(shè)定一個(gè)長(zhǎng)度10的定時(shí)任務(wù)線程池taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));} }2、通過(guò)配置開(kāi)啟
Spring Boot quartz 已經(jīng)提供了一個(gè)配置用來(lái)配置線程池的大小,如下;
spring.task.scheduling.pool.size=10只需要在配置文件中添加如上的配置即可生效!
3、結(jié)合@Async
@Async這個(gè)注解都用過(guò),用來(lái)開(kāi)啟異步任務(wù)的,使用@Async這個(gè)注解之前一定是要先配置線程池的,配置如下:
@Beanpublic?ThreadPoolTaskExecutor?taskExecutor()?{ThreadPoolTaskExecutor?poolTaskExecutor?=?new?ThreadPoolTaskExecutor();poolTaskExecutor.setCorePoolSize(4);poolTaskExecutor.setMaxPoolSize(6);//?設(shè)置線程活躍時(shí)間(秒)poolTaskExecutor.setKeepAliveSeconds(120);//?設(shè)置隊(duì)列容量poolTaskExecutor.setQueueCapacity(40);poolTaskExecutor.setRejectedExecutionHandler(new?ThreadPoolExecutor.CallerRunsPolicy());//?等待所有任務(wù)結(jié)束后再關(guān)閉線程池poolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);return?poolTaskExecutor;}然后在@Scheduled方法上標(biāo)注@Async這個(gè)注解即可實(shí)現(xiàn)多線程定時(shí)任務(wù),代碼如下:
@Async@Scheduled(cron?=?"0/2?*?*?*?*???")public?void?test2()?{System.out.println("..................執(zhí)行test2.................");}總結(jié)
本篇文章介紹了Spring Boot 中實(shí)現(xiàn)多線程定時(shí)任務(wù)的三種方案,你喜歡哪一種?
往期推薦SpringCloud Ribbon中的7種負(fù)載均衡策略!
Java奪命21連問(wèn)!(附答案)
MySQL 精選 60 道面試題(含答案)
總結(jié)
以上是生活随笔為你收集整理的Spring Boot 如何解决多个定时任务阻塞问题?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java夺命21连问!(附答案)
- 下一篇: 【视频版】最新版Swagger 3升级指