SpringBoot : 異步線程池配置和使用
在spring boot中,基本上告別xml配置文件,所以本文只針對註解下的使用做介紹。
線程池
從JUC 的Java.utils.concurrent.Excutor說起,然後到TaskExecuter。其中spring對其有多個實現,其中最常用的應該是ThreadPoolTaskExecutor這裏可以看一下繼承關係。
異步註解@Asyns
Spring對異步支持註解
@Target({ElementType.METHOD, ElementType.TYPE})
可以作用於方法和類上。
異步調用有主要下面兩個區別
- 有無參數
@Async
public void simpleTest() {
log.info(“無參,無返回”);
}
@Async
public void withParameter(String str) {
log.info(“有參,無返回。參數是={}”,str);
}
- 有無返回值,即另一種是可以返回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
開啓異步調用。