springboot2.0以上調(diào)度器配置線程池的實(shí)現(xiàn)
一 我們使用@EnableScheduling 開(kāi)啟spring task 調(diào)度器的時(shí)候,發(fā)現(xiàn)此調(diào)度器默認(rèn)配置為單線程的。
二 打開(kāi)注解發(fā)現(xiàn)其配置信息在此SchedulingConfiguration類(lèi)中。發(fā)現(xiàn)其創(chuàng)建了ScheduledTaskRegistrar類(lèi)
研讀代碼不難發(fā)現(xiàn)調(diào)度器默認(rèn)配置是如下代碼,線程池為單線程的。
protected void scheduleTasks() { if (this.taskScheduler == null) { this.localExecutor = Executors.newSingleThreadScheduledExecutor(); this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor); } if (this.triggerTasks != null) { for (TriggerTask task : this.triggerTasks) { addScheduledTask(scheduleTriggerTask(task)); } } if (this.cronTasks != null) { for (CronTask task : this.cronTasks) { addScheduledTask(scheduleCronTask(task)); } } if (this.fixedRateTasks != null) { for (IntervalTask task : this.fixedRateTasks) { addScheduledTask(scheduleFixedRateTask(task)); } } if (this.fixedDelayTasks != null) { for (IntervalTask task : this.fixedDelayTasks) { addScheduledTask(scheduleFixedDelayTask(task)); } } }
如何改變此配置呢?
如果想改變其中配置則只需要如下核心代碼
package com.ccbobe.common.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; @EnableScheduling @Configuration public class SchedulerConfig implements SchedulingConfigurer { @Bean public ScheduledExecutorService concurrentTaskScheduler(){ ScheduledThreadPoolExecutor executorService = new ScheduledThreadPoolExecutor(20); executorService.setMaximumPoolSize(20); executorService.setRejectedExecutionHandler(new ScheduledThreadPoolExecutor.CallerRunsPolicy()); return executorService; } @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.setScheduler(concurrentTaskScheduler()); } }
其中Scheduler 支持兩種,種分別是:TaskScheduler 和 ScheduledExecutorService
/** * Set the {@link TaskScheduler} to register scheduled tasks with, or a * {@link java.util.concurrent.ScheduledExecutorService} to be wrapped as a * {@code TaskScheduler}. */ public void setScheduler(@Nullable Object scheduler) { if (scheduler == null) { this.taskScheduler = null; } else if (scheduler instanceof TaskScheduler) { this.taskScheduler = (TaskScheduler) scheduler; } else if (scheduler instanceof ScheduledExecutorService) { this.taskScheduler = new ConcurrentTaskScheduler(((ScheduledExecutorService) scheduler)); } else { throw new IllegalArgumentException("Unsupported scheduler type: " + scheduler.getClass()); } }
完成以上配置,即可讓spring task 運(yùn)行在多線程環(huán)境中。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Boot + Vue 前后端分離項(xiàng)目如何踢掉已登錄用戶
這篇文章主要介紹了Spring Boot + Vue 前后端分離項(xiàng)目如何踢掉已登錄用戶,需要的朋友可以參考下2020-05-05詳解Spring?Security?捕獲?filter?層面異常返回我們自定義的內(nèi)容
Spring?的異常會(huì)轉(zhuǎn)發(fā)到?BasicErrorController?中進(jìn)行異常寫(xiě)入,然后才會(huì)返回客戶端。所以,我們可以在?BasicErrorController?對(duì)?filter異常進(jìn)行捕獲并處理,下面通過(guò)本文給大家介紹Spring?Security?捕獲?filter?層面異常,返回我們自定義的內(nèi)容,感興趣的朋友一起看看吧2022-05-05Java AQS中CyclicBarrier回環(huán)柵欄的使用
這篇文章主要介紹了Java中的 CyclicBarrier詳解,CyclicBarrier沒(méi)有顯示繼承哪個(gè)父類(lèi)或者實(shí)現(xiàn)哪個(gè)父接口, 所有AQS和重入鎖不是通過(guò)繼承實(shí)現(xiàn)的,而是通過(guò)組合實(shí)現(xiàn)的,下文相關(guān)內(nèi)容需要的小伙伴可以參考一下2023-02-02java實(shí)現(xiàn)題目以及選項(xiàng)亂序的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)題目以及選項(xiàng)亂序的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Java利用過(guò)濾器實(shí)現(xiàn)完善登錄功能
這篇文章主要為大家詳細(xì)介紹了Java如何利用過(guò)濾器實(shí)現(xiàn)完善登錄功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定幫助,需要的可以參考一下2022-09-09Java不用算數(shù)運(yùn)算符來(lái)實(shí)現(xiàn)求和方法
我們都知道,Java的運(yùn)算符除了具有優(yōu)先級(jí)之外,還有一個(gè)結(jié)合性的特點(diǎn)。當(dāng)一個(gè)表達(dá)式中出現(xiàn)多種運(yùn)算符時(shí),執(zhí)行的先后順序不僅要遵守運(yùn)算符優(yōu)先級(jí)別的規(guī)定,還要受運(yùn)算符結(jié)合性的約束,以便確定是自左向右進(jìn)行運(yùn)算還是自右向左進(jìn)行運(yùn)算,但是如果不用運(yùn)算符怎么求和呢2022-04-04Java HttpClient實(shí)現(xiàn)socks代理的示例代碼
這篇文章主要介紹了Java HttpClient 實(shí)現(xiàn) socks 代理的示例代碼,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-11-11Java集合的組內(nèi)平均值的計(jì)算方法總結(jié)
在Java中,經(jīng)常需要對(duì)集合進(jìn)行各種操作,其中之一就是計(jì)算集合的組內(nèi)平均值,本文將介紹如何使用Java集合來(lái)計(jì)算組內(nèi)平均值,并提供一些示例代碼和實(shí)用技巧2024-08-08通過(guò)String.intern()方法淺談堆中常量池
這篇文章主要介紹了通過(guò)String.intern()方法淺談堆中常量池,在JDK7之前,字符串常量是存在永久帶Perm 區(qū)的,JDK7開(kāi)始在將常量池遷移到堆中,這個(gè)變化也導(dǎo)致了String的新特性,下面我們慢慢進(jìn)行介紹。,需要的朋友可以參考下2019-06-06