2016-10-04 3 views
1

Springでは、@RequestMappingで注釈を付けられたメソッドで、CompletableFutureまたはFutureなど、さまざまなオブジェクトを返すことができます。これにより、私は非同期メソッドを生成し、準備ができたらいつでもバネに値を返すことができます。私が理解していないことは、これに何らかの利益があるかどうかということです。例えばこの場合なぜ非同期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

これは、​​メソッドを使用して、サーブレット3の非同期要求処理を利用します。これを達成するためにherehere

を読んで、サーブレット3 Webアプリケーションは(request.startAsyncを呼ぶ)と、他のいくつかの別のスレッドからの応答への書き込みを続けるために返されたAsyncContextを使用することができます。クライアントの視点から見ると、リクエストは他のHTTPリクエストとレスポンスのやりとりのように見えます。完了までに時間がかかります。以下はイベントのシーケンスです:

関連する問題