2017-05-22 88 views
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註解?在控制器級別還是在服務級別(業務邏輯層)或存儲庫? 或者我在這裏採取了錯誤的做法?當有些事情需要大量處理時,我應該只在服務和存儲庫層中添加它嗎?

+2

刪除它...您已經使用了'CompletableFuture',它已經是異步了。無需添加另一個「@ ASync」。你太過複雜了。你也在自己創建類的新實例,所以添加註釋或嘗試自動佈線不會做任何事情,因爲那些不是由Spring管理的)。 –

+0

如果我想刪除'CompletableFuture'並且堅持使用Spring框架'@ Async'註釋呢?現在我的代碼有一些兩個,我想解決其中之一 –

+0

請參閱http://stackoverflow.com/questions/28908229/how-to-implement-an-asynchronous-rest-request-toa-a-控制器使用springboot的另一個帖子混淆異步方法調用與異步請求處理。 – Kayaman

回答

0

由於M. Deinum說,我不需要在我的類中使用@Async註釋,因爲我使用Java可以完成的未來,我不需要將它與Spring框架混合。