AsyncConfigurerSupport自定義異步線程池處理異常
一、AsyncConfigurerSupport 簡介
spring 中開啟異步只要在配置類加上
@EnableAsync 同時在service方法中加上@Async即可,注意service中的方法想要異步調(diào)用必須是通過注入調(diào)用(spring 代理)。
@Service
public class ServiceA{
public void testA(){
testB();
}
@Async
public void testB(){
}
}
上述方法在調(diào)用testA時是同步調(diào)用,而非異步調(diào)用,方法內(nèi)部的直接調(diào)用是沒有經(jīng)過spring 代理的。
二、自定義異步調(diào)用的線程池和異常處理
AsyncConfigurerSupport 只定義了兩個方法分別用于自定義異步線程池、異步產(chǎn)生的異常捕獲,通過實現(xiàn)此類即可實現(xiàn)自定義的異步線程池。
demo如下:
新建子類 AsyncConfigHandler
@Configuration
@EnableAsync
public class AsyncConfigHandler extends AsyncConfigurerSupport {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(10);
executor.initialize();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new MyAsyncUncaughtExceptionHandler();
}
@Bean // /actuator/shutdown
@Override
public Executor getAsyncExecutor2() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setTaskDecorator(new SomeTaskDecorator());
executor.setCorePoolSize(4);
executor.setMaxPoolSize(8);
executor.setQueueCapacity(100);
executor.setAllowCoreThreadTimeOut(false);
executor.setKeepAliveSeconds(0);
executor.setThreadNamePrefix("DefaultAsync-");
executor.setWaitForTasksToCompleteOnShutdown(true); // ? ????? ??
executor.initialize();
return executor;
}
static class SomeTaskDecorator implements TaskDecorator {
@Override
public Runnable decorate(Runnable runnable) {
return () -> {
try {
log.info("Some Task Decorator Start");
runnable.run();
} finally {
log.info("Some Task Decorator End");
}
};
}
}
}
class MyAsyncUncaughtExceptionHandler implements AsyncUncaughtExceptionHandler {
@Override
public void handleUncaughtException(Throwable ex, Method method, Object... params) {
System.out.println("class#method: " + method.getDeclaringClass().getName() + "#" + method.getName());
System.out.println("type : " + ex.getClass().getName());
System.out.println("exception : " + ex.getMessage());
}
}編寫支持異步調(diào)用注解@Async的 DemoService
@Service
public class DemoService {
@Async
public void testAsync() throws InterruptedException {
System.out.println("這里是異步方法");
TimeUnit.SECONDS.sleep(10);
int i = 1 / 0;
}
}
編寫測試 controller
@RestController
@RequestMapping(value = "time")
public class DemoController {
@Autowired
private DemoService demoService;
@RequestMapping(value = "getTimeAndAsync")
public String getTimeAndAsync() throws InterruptedException {
demoService.testAsync();
return "異步加載=》" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
}
}新建spring boot應用的步驟省略
訪問 http://localhost:8080/time/getTimeAndAsync
瀏覽器會立即輸出
異步加載=》2021-02-20 15:56:16
等待十秒鐘后會捕獲異常
class#method: com.example.bootdemo.service.DemoService#testAsync
type : java.lang.ArithmeticException
exception : / by zero
同步調(diào)用中可以采用 @RestControllerAdvice 和 @ExceptionHandler 注解捕獲全局的異常然后進行處理,如果是異步調(diào)用則需要實現(xiàn) AsyncUncaughtExceptionHandler 進行單獨的額外處理。
以上就是AsyncConfigurerSupport自定義異步線程池實現(xiàn)的詳細內(nèi)容,更多關于AsyncConfigurerSupport異步線程池的資料請關注腳本之家其它相關文章!
相關文章
Java按順序提取Word內(nèi)容的方法步驟(文本+數(shù)學公式)
本文分享通過Java POI庫解析Word試卷內(nèi)容,將數(shù)學公式轉(zhuǎn)換為LaTeX并保持原有順序的方法,涉及XML文本提取、節(jié)點替換及文檔重構(gòu),解決公式位置錯亂問題,實現(xiàn)非結(jié)構(gòu)化到結(jié)構(gòu)化轉(zhuǎn)換,需要的朋友可以參考下2025-09-09
關于集合與數(shù)組轉(zhuǎn)換實現(xiàn)方法
這篇文章主要介紹了關于集合與數(shù)組轉(zhuǎn)換實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-06-06
深入了解Java中String、Char和Int之間的相互轉(zhuǎn)換
這篇文章主要介紹了深入了解Java中String、Char和Int之間的相互轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,,需要的朋友可以參考下2019-06-06
Java基于面向?qū)ο髮崿F(xiàn)一個戰(zhàn)士小游戲
這篇文章主要為大家詳細介紹了Java如何基于面向?qū)ο髮崿F(xiàn)一個戰(zhàn)士小游戲,文中的示例代碼講解詳細,感興趣的小伙伴可以動手嘗試一下2022-07-07
idea創(chuàng)建spring boot工程及配置文件(最新推薦)
本文給大家介紹idea創(chuàng)建spring boot工程及配置文件,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-11-11
線程池之jdk1.8 Executors創(chuàng)建線程池的幾種方式
這篇文章主要介紹了線程池之jdk1.8 Executors創(chuàng)建線程池的幾種方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
Java線程安全的計數(shù)器簡單實現(xiàn)代碼示例
這篇文章主要介紹了Java線程安全的計數(shù)器簡單實現(xiàn)代碼示例,具有一定參考價值,需要的朋友可以了解下。2017-10-10

