0
我正在使用Spring框架爲移動和Web應用程序構建API。據我所知,註釋@Async
意味着一個新的線程將被派生出來迎合這個方法的處理。這樣保持處理異步地運行,則控制器代碼看起來是這樣的:@Async註釋去哪裏?
@Async
@RequestMapping(path = "", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody CompletableFuture<ResponseEntity<ApiResponse>> DoSomething()
{
log.info("Get something done with the request received from user ");
return (CompletableFuture.supplyAsync(() -> DoSomethingProcessor()));
}
這裏我有所述控制器接收請求,然後把它發送到一個處理器的方法(這也是@Async
)。在這種情況下,控制器可以自由地接收更多請求,並且請求將同時運行。這是處理器方法的代碼:
@Async
private ResponseEntity<ApiResponse> GetPermissionsProcessor() {
//Do things here
return new ApiResponse()
}
處理器調用服務方法,如果需要,它又調用存儲庫。
UPDATE: 服務層是這樣的:
@Async
public static ApiResponse CreateRole (Object anObject) throws Exception{
//Do things and call repository
return new ApiResponse(x);
}
這是庫代碼:
public static Integer InsertRole (Object newObject, DataSourceConfig dsc)
{
String sql = "INSERT INTO table";
dsc.insertObject(sql, NewObject);
return dsc.insertObject(sql, newRole);
}
我的問題是我在哪裏停止加入@Async
註解?在控制器級別還是在服務級別(業務邏輯層)或存儲庫? 或者我在這裏採取了錯誤的做法?當有些事情需要大量處理時,我應該只在服務和存儲庫層中添加它嗎?
刪除它...您已經使用了'CompletableFuture',它已經是異步了。無需添加另一個「@ ASync」。你太過複雜了。你也在自己創建類的新實例,所以添加註釋或嘗試自動佈線不會做任何事情,因爲那些不是由Spring管理的)。 –
如果我想刪除'CompletableFuture'並且堅持使用Spring框架'@ Async'註釋呢?現在我的代碼有一些兩個,我想解決其中之一 –
請參閱http://stackoverflow.com/questions/28908229/how-to-implement-an-asynchronous-rest-request-toa-a-控制器使用springboot的另一個帖子混淆異步方法調用與異步請求處理。 – Kayaman