2016-10-04 43 views
1

Spring允許使用@RequestMapping註釋的方法返回各種對象,包括CompletableFutureFuture。這使我可以產生一個異步方法,並讓Spring在準備就緒時返回值。我不確定我的理解是否對此有任何好處。例如:爲什麼使異步REST服務有利?

@RestController 
public class MyController { 
    @RequestMapping("/user/{userId}") 
    public CompletableFuture<User> getUser(@PathVariable("userId") String userId) { 
     return CompletableFuture.supplyAsync(
      () -> this.dataAccess.getUser(userId)); 
} 

在這種情況下,即使實際的計算是在後臺發生的事情,連接仍不會關閉,請求線程仍將處於激活狀態,直到它完成。它是如何優於說:

@RequestMapping("/user/{userId}") 
public User getUser(@PathVariableS("userId") String userId) { 
    return this.dataAccess.getUser(userId); 
} 

從第一幾眼,這似乎是一個更好的方法,因爲是一個額外的線程,看起來完成一個觀察者的開銷。

回答

1

這利用了Servlet 3的異步請求處理,使用​​方法。閱讀herehere

爲了實現這一目標,一個Servlet 3的Web應用程序可以調用request.startAsync(),並使用返回的AsyncContext繼續寫,從其他一些單獨的線程的響應。同時從客戶端的角度來看,請求仍然看起來像其他任何HTTP請求 - 響應交互。它只需要更長的時間才能完成。以下是事件的順序: