国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 贡觉县| 通城县| 郎溪县| 全椒县| 南雄市| 芜湖市| 马关县| 平阴县| 镇坪县| 定结县| 九龙坡区| 彰化县| 兴海县| 芦山县| 阿拉尔市| 定安县| 阜城县| 成武县| 安塞县| 房产| 黄山市| 凌海市| 杭锦后旗| 澳门| 东辽县| 桃园县| 青岛市| 通榆县| 鹤庆县| 南平市| 玛沁县| 阳原县| 惠水县| 政和县| 灵宝市| 汉中市| 遂溪县| 准格尔旗| 井陉县| 梁河县| 东港市|