SpringBoot : 異步線程池配置和使用

SpringBoot : 異步線程池配置和使用

在spring boot中,基本上告別xml配置文件,所以本文只針對註解下的使用做介紹。

線程池

JUC 的Java.utils.concurrent.Excutor說起,然後到TaskExecuter。其中spring對其有多個實現,其中最常用的應該是ThreadPoolTaskExecutor這裏可以看一下繼承關係。
ThreadPoolTaskExecutor繼承關係

異步註解@Asyns

Spring對異步支持註解

@Target({ElementType.METHOD, ElementType.TYPE})

可以作用於方法和類上。
異步調用有主要下面兩個區別

  1. 有無參數

@Async
public void simpleTest() {
log.info(“無參,無返回”);
}
@Async
public void withParameter(String str) {
log.info(“有參,無返回。參數是={}”,str);
}

  1. 有無返回值,即另一種是可以返回Future

@Async
public Future asyncInvokeReturnFuture(String str) {
Future future = new AsyncResult(str);
return future;
}

線程池配置

可以新建一個Configuration類,進行線程池配置。
實現AsyncConfigurer接口對異常線程池更加細粒度的控制 。可以自定義異常處理。

/**
 * 線程池配置
 * @author hby
 *
 */
@Configuration
@ComponentScan()//指定掃描任務執行類,默認全掃
//開始異步支持
@EnableAsync
public class AsyncConfig implements AsyncConfigurer{

private static final Logger log = LoggerFactory.getLogger(AsyncConfig.class);

	@Override
    public Executor getAsyncExecutor() {
    //線程池
   ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
   taskExecutor.setCorePoolSize(5);//參數可以配到yml裏面
   taskExecutor.setMaxPoolSize(10);
   taskExecutor.setQueueCapacity(25);
   taskExecutor.initialize();
   return taskExecutor;
}

 // 自定義異常處理器,不做處理可以直接返回Null,使用默認處理器,將異常往拋吧
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
    return new MyAsycnExcupyionHandler();
}}

    class MyAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {  

        @Override  
        public void handleUncaughtException(Throwable throwable, Method method, Object... obj) {  
            log.info("Exception message - " + throwable.getMessage());  
            log.info("Method name - " + method.getName());  
            for (Object param : obj) {  
                log.info("Parameter value - " + param);  
            }  
        }  
    } 

@EnableAsync開啓異步調用

在springboot項目啓動類上加上註解

@EnableAsync

開啓異步調用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章