亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

spring boot使用自定義配置的線程池執行Async異步任務

2024-07-13 10:16:49
字體:
來源:轉載
供稿:網友

在前面的博客中,我們使用了spring boot的異步操作,當時,我們使用的是默認的線程池,但是,如果我們想根據項目來定制自己的線程池了,下面就來說說,如何定制線程池!

一、增加配置屬性類

package com.chhliu.springboot.async.configuration; import org.springframework.boot.context.properties.ConfigurationProperties;  @ConfigurationProperties(prefix = "spring.task.pool") // 該注解的locations已經被啟用,現在只要是在環境中,都會優先加載 public class TaskThreadPoolConfig {  private int corePoolSize;   private int maxPoolSize;   private int keepAliveSeconds;   private int queueCapacity;    …………省略getter,setter方法………… } 

二、創建線程池

package com.chhliu.springboot.async.pool; import java.util.concurrent.Executor; import java.util.concurrent.ThreadPoolExecutor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;  import com.chhliu.springboot.async.configuration.TaskThreadPoolConfig;  @Configuration @EnableAsync public class TaskExecutePool {   @Autowired  private TaskThreadPoolConfig config;   @Bean  public Executor myTaskAsyncPool() {   ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();   executor.setCorePoolSize(config.getCorePoolSize());   executor.setMaxPoolSize(config.getMaxPoolSize());   executor.setQueueCapacity(config.getQueueCapacity());   executor.setKeepAliveSeconds(config.getKeepAliveSeconds());   executor.setThreadNamePrefix("MyExecutor-");    // rejection-policy:當pool已經達到max size的時候,如何處理新任務   // CALLER_RUNS:不在新線程中執行任務,而是由調用者所在的線程來執行   executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());   executor.initialize();   return executor;  } } 

三、在主類中開啟配置支持

package com.chhliu.springboot.async; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.scheduling.annotation.EnableAsync;  import com.chhliu.springboot.async.configuration.TaskThreadPoolConfig;  @SpringBootApplication @EnableAsync @EnableConfigurationProperties({TaskThreadPoolConfig.class} ) // 開啟配置屬性支持 public class SpringbootAsyncApplication {   public static void main(String[] args) {   SpringApplication.run(SpringbootAsyncApplication.class, args);  } } 

四、測試類

package com.chhliu.springboot.async.pool;  import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component;  @Component public class AsyncTask {  protected final Logger logger = LoggerFactory.getLogger(this.getClass());    @Async("myTaskAsyncPool") //myTaskAsynPool即配置線程池的方法名,此處如果不寫自定義線程池的方法名,會使用默認的線程池  public void doTask1(int i) throws InterruptedException{   logger.info("Task"+i+" started.");  } } 

五、測試

package com.chhliu.springboot.async; import java.util.concurrent.ExecutionException; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner;  import com.chhliu.springboot.async.pool.AsyncTask;  @RunWith(SpringRunner.class) @SpringBootTest public class SpringbootAsyncApplicationTests {  protected final Logger logger = LoggerFactory.getLogger(this.getClass());  @Autowired  private AsyncTask asyncTask;   @Test  public void AsyncTaskTest() throws InterruptedException, ExecutionException {    for (int i = 0; i < 100; i++) {    asyncTask.doTask1(i);   }    logger.info("All tasks finished.");  } } 

測試結果如下:

2017-03-20 20:15:15.208 INFO 4068 --- [ MyExecutor-10] c.c.springboot.async.pool.AsyncTask  : Task60 started. 2017-03-20 20:15:15.208 INFO 4068 --- [ MyExecutor-25] c.c.springboot.async.pool.AsyncTask  : Task61 started. 2017-03-20 20:15:15.208 INFO 4068 --- [ MyExecutor-6] c.c.springboot.async.pool.AsyncTask  : Task62 started. 2017-03-20 20:15:15.208 INFO 4068 --- [ MyExecutor-23] c.c.springboot.async.pool.AsyncTask  : Task63 started. 2017-03-20 20:15:15.208 INFO 4068 --- [ MyExecutor-20] c.c.springboot.async.pool.AsyncTask  : Task64 started. 2017-03-20 20:15:15.208 INFO 4068 --- [ MyExecutor-19] c.c.springboot.async.pool.AsyncTask  : Task65 started. 2017-03-20 20:15:15.208 INFO 4068 --- [ MyExecutor-16] c.c.springboot.async.pool.AsyncTask  : Task66 started. 2017-03-20 20:15:15.208 INFO 4068 --- [ MyExecutor-15] c.c.springboot.async.pool.AsyncTask  : Task67 started. 2017-03-20 20:15:15.208 INFO 4068 --- [ MyExecutor-12] c.c.springboot.async.pool.AsyncTask  : Task68 started. 2017-03-20 20:15:15.209 INFO 4068 --- [ MyExecutor-1] c.c.springboot.async.pool.AsyncTask  : Task69 started. 2017-03-20 20:15:15.209 INFO 4068 --- [ MyExecutor-11] c.c.springboot.async.pool.AsyncTask  : Task81 started. 2017-03-20 20:15:15.209 INFO 4068 --- [ MyExecutor-8] c.c.springboot.async.pool.AsyncTask  : Task82 started. 2017-03-20 20:15:15.209 INFO 4068 --- [ MyExecutor-7] c.c.springboot.async.pool.AsyncTask  : Task83 started. 2017-03-20 20:15:15.209 INFO 4068 --- [ MyExecutor-4] c.c.springboot.async.pool.AsyncTask  : Task84 started. 2017-03-20 20:15:15.209 INFO 4068 --- [ MyExecutor-29] c.c.springboot.async.pool.AsyncTask  : Task85 started. 2017-03-20 20:15:15.209 INFO 4068 --- [ MyExecutor-21] c.c.springboot.async.pool.AsyncTask  : Task86 started. 2017-03-20 20:15:15.209 INFO 4068 --- [ MyExecutor-17] c.c.springboot.async.pool.AsyncTask  : Task88 started. 

測試結果ok!

六、配置默認的線程池

如果我們想使用默認的線程池,但是只是想修改默認線程池的配置,那怎么做了,此時我們需要實現AsyncConfigurer類,示例代碼如下:

import java.lang.reflect.Method; import java.util.concurrent.Executor; import java.util.concurrent.ThreadPoolExecutor; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.AsyncConfigurer; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import com.chhliu.cq.emailservice.threadconfiguration.TaskThreadPoolConfig; import lombok.extern.slf4j.Slf4j;  /**  * 注意:該線程池被所有的異步任務共享,而不屬于某一個異步任務  * 描述:配置異步任務的線程池  * @author chhliu  * 創建時間:2017年5月22日 上午10:20:56  * @version 1.2.0  */ @Slf4j @Configuration public class AsyncTaskExecutePool implements AsyncConfigurer{   @Autowired  private TaskThreadPoolConfig config; // 配置屬性類,見上面的代碼   @Override  public Executor getAsyncExecutor() {   ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();   executor.setCorePoolSize(config.getCorePoolSize());   executor.setMaxPoolSize(config.getMaxPoolSize());   executor.setQueueCapacity(config.getQueueCapacity());   executor.setKeepAliveSeconds(config.getKeepAliveSeconds());   executor.setThreadNamePrefix("taskExecutor-");    // rejection-policy:當pool已經達到max size的時候,如何處理新任務   // CALLER_RUNS:不在新線程中執行任務,而是由調用者所在的線程來執行   executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());   executor.initialize();   return executor;  }   @Override  public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {// 異步任務中異常處理   return new AsyncUncaughtExceptionHandler() {        @Override    public void handleUncaughtException(Throwable arg0, Method arg1, Object... arg2) {     log.error("=========================="+arg0.getMessage()+"=======================", arg0);     log.error("exception method:"+arg1.getName());    }   };  } } 

使用的時候,只需在方法上加上@Async即可。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
51精品国产黑色丝袜高跟鞋| 欧美精品精品精品精品免费| 精品毛片网大全| 久久国产精品99国产精| 国产丝袜一区二区三区免费视频| 亚洲成人亚洲激情| 一道本无吗dⅴd在线播放一区| 久久精品久久久久久| 精品女同一区二区三区在线播放| 最新91在线视频| 久久夜色精品亚洲噜噜国产mv| 亚洲成人av片| 久久久久久久国产精品| 91欧美视频网站| 亚洲精品小视频在线观看| 久久久91精品国产| 亚洲精品一区中文| 庆余年2免费日韩剧观看大牛| 国产色婷婷国产综合在线理论片a| 精品久久久国产精品999| 日本高清不卡在线| 久久影院中文字幕| 中文字幕免费精品一区| 亚洲国产成人久久综合| 欧美福利视频网站| 欧美日韩不卡合集视频| 亚洲免费人成在线视频观看| 国产在线观看精品一区二区三区| 亚洲国产欧美一区二区三区久久| 欧美黑人一级爽快片淫片高清| 成人国产精品免费视频| 国产aaa精品| 国内精品久久影院| 91在线免费观看网站| 亚洲成年人影院在线| 国产亚洲福利一区| www.xxxx欧美| 黑人巨大精品欧美一区二区三区| 精品久久久久久久久久国产| 曰本色欧美视频在线| 中文字幕亚洲综合| 国产亚洲欧洲黄色| 久久久久久91香蕉国产| 8x拔播拔播x8国产精品| 国产精品成人久久久久| 97精品免费视频| 亚洲专区在线视频| 欧美激情乱人伦一区| 一个人www欧美| 亚洲国产精品国自产拍av秋霞| 亚洲午夜色婷婷在线| 国产中文字幕91| 色偷偷88888欧美精品久久久| 成人免费视频在线观看超级碰| 欧美性生活大片免费观看网址| 亚洲热线99精品视频| 狠狠色狠狠色综合日日小说| 欧美在线视频一二三| 国产裸体写真av一区二区| 日韩精品在线私人| 亚洲精品ady| 亚洲视频在线视频| 深夜成人在线观看| 欧美一级淫片videoshd| 亚洲a级在线播放观看| 亚洲国产欧美在线成人app| 亚洲欧美在线第一页| 久久艳片www.17c.com| 久久久久久久亚洲精品| 亚洲视屏在线播放| 中文字幕v亚洲ⅴv天堂| 91精品国产91久久久| 久久精品中文字幕免费mv| 久久精品国产96久久久香蕉| 色悠久久久久综合先锋影音下载| 欧美精品一区二区三区国产精品| 欧美视频专区一二在线观看| 欧美日韩亚洲网| 日韩中文av在线| 热久久免费视频精品| 欧日韩不卡在线视频| 中文字幕久热精品在线视频| 中文字幕日本欧美| 88国产精品欧美一区二区三区| 在线观看欧美日韩| 中文字幕亚洲欧美日韩在线不卡| 青青精品视频播放| 国产精品草莓在线免费观看| 精品国产区一区二区三区在线观看| 久热精品视频在线观看| 欧美激情按摩在线| 成人性生交大片免费看小说| 国产999视频| 欧美大全免费观看电视剧大泉洋| 亚洲黄页网在线观看| 91亚洲精品一区| 国产香蕉精品视频一区二区三区| 午夜精品在线观看| 青青精品视频播放| 久久夜色精品国产亚洲aⅴ| 黑人巨大精品欧美一区二区| 久久精品久久久久久| 亚洲风情亚aⅴ在线发布| 色老头一区二区三区| 欧美乱妇40p| 国产91成人video| 国产亚洲视频中文字幕视频| 成人亚洲综合色就1024| 国产精品久久久久久亚洲调教| 久久久久久久亚洲精品| 久久综合亚洲社区| 国模吧一区二区| 51精品在线观看| 国产不卡视频在线| 久久精品视频va| 国产精品高潮视频| 亚洲aⅴ日韩av电影在线观看| 日韩电影免费在线观看中文字幕| 2020欧美日韩在线视频| 国产精品91久久久久久| 日韩精品在线第一页| 欧美日韩亚洲成人| 日韩网站免费观看高清| 亚洲高清福利视频| 久久亚洲电影天堂| 亚洲一区制服诱惑| 96国产粉嫩美女| 久久久免费在线观看| 欧美性猛交xxxx免费看久久久| 久久亚洲一区二区三区四区五区高| 91香蕉嫩草神马影院在线观看| 在线视频一区二区| 国产精品女人网站| 日韩亚洲精品视频| 91在线观看免费高清完整版在线观看| 97超碰蝌蚪网人人做人人爽| 欧美伊久线香蕉线新在线| 日韩视频在线免费观看| 色婷婷成人综合| 国产精品视频26uuu| 亚洲综合一区二区不卡| 国产精品人成电影在线观看| 日韩成人黄色av| 亚洲字幕在线观看| 亚洲欧洲第一视频| www.国产精品一二区| 国产精品久久77777| 97在线免费观看视频| 久久在精品线影院精品国产| 久久久久久com| 海角国产乱辈乱精品视频| 国产一区私人高清影院| 免费97视频在线精品国自产拍| 97视频网站入口| www.99久久热国产日韩欧美.com| 欧美一区二区三区艳史| 国产性色av一区二区| 国产在线视频91| 欧美国产日韩一区二区在线观看| 日韩av手机在线观看| 亚洲精品中文字幕有码专区| 日本午夜精品理论片a级appf发布| 亚洲自拍av在线| 日本精品免费一区二区三区|