Spring @Async 使用

Spring @Async 使用

開啟異步支持

@Configuration
@EnableAsync
public class SpringAsyncConfig { ... }

默認情況下,@EnableAsync檢測Spring的@Async註釋和EJB 3.1 javax. EJB .異步;此選項還可用於檢測其他用戶定義的註釋類型。

@Async註解使用

  1. 無返回值
@Async
public void asyncMethodWithVoidReturnType() {
System.out.println("Execute method asynchronously. "
+ Thread.currentThread().getName());
}
  1. 有返回值
@Async
public Future<string> asyncMethodWithReturnType() {
System.out.println("Execute method asynchronously - "
+ Thread.currentThread().getName());
try {
Thread.sleep(5000);
return new AsyncResult<string>("hello world !!!!");
} catch (InterruptedException e) {
//
}

return null;
}
/<string>/<string>

執行器

默認情況下,Spring 使用SimpleAsyncTaskExecutor去執行這些異步方法(此執行器沒有限制線程數)。 此默認值可以從兩個層級進行覆蓋:

  • 方法級別
  • 應用級別

1. 方法級別覆蓋

@Async("threadPoolTaskExecutor")
public void asyncMethodWithConfiguredExecutor() {
System.out.println("Execute method with configured executor - "
+ Thread.currentThread().getName());
}

2. 應用級別覆蓋

配置類應該實現AsyncConfigurer接口——這意味著它擁有getAsyncExecutor()方法的實現。在這裡,我們將返回整個應用程序的執行器——這現在成為運行帶有@Async註釋的方法的默認執行器:

@Configuration
@EnableAsync
public class SpringAsyncConfig implements AsyncConfigurer {

@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.initialize();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(25);
return executor;
}

}

異常處理

當方法返回值是Future的時候,異常捕獲是沒問題的 - Future.get()方法會拋出異常。

但是,如果返回類型是Void,那麼異常在當前線程就捕獲不到。因此,我們需要添加額外的配置來處理異常。

我們將通過實現AsyncUncaughtExceptionHandler接口創建一個定製的async異常處理程序。handleUncaughtException()方法在存在任何未捕獲的異步異常時調用:

public class CustomAsyncExceptionHandler
implements AsyncUncaughtExceptionHandler {

@Override
public void handleUncaughtException(
Throwable throwable, Method method, Object... obj) {

System.out.println("Exception message - " + throwable.getMessage());
System.out.println("Method name - " + method.getName());
for (Object param : obj) {
System.out.println("Parameter value - " + param);
}
}

}

在上一節中,我們研究了由configuration類實現的AsyncConfigurer接口。作為其中的一部分,我們還需要覆蓋getAsyncUncaughtExceptionHandler()方法來返回我們自定義的異步異常處理程序:

@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new CustomAsyncExceptionHandler();
}


分享到:


相關文章: