2.20. CompletionStage タイプのサポート

JAX-RS 2.1 仕様は、@Suspended アノテーションを使用する代わりに CompletionStage を返すことで非同期リソースメソッドの宣言をサポートします。

リソースのメソッドがサブスクライブしている CompletionStage を返すと常に、リクエストは一時停止されます。このリクエストは、 CompletionStage が以下の場合にのみ再開されます。

  • 値に解決され、メソッドの戻り値として処理される。
  • エラーケースとして処理され、例外はリソースメソッドによって発生したかのように処理される。

以下は、CompletionStage を使用した非同期処理の例です。

public class SimpleResource
{

   @GET
   @Path("basic")
   @Produces("text/plain")
   public CompletionStage<Response> getBasic() throws Exception
   {
      final CompletableFuture<Response> response = new CompletableFuture<>();
      Thread t = new Thread()
      {
         @Override
         public void run()
         {
            try
            {
               Response jaxrs = Response.ok("basic").type(MediaType.TEXT_PLAIN).build();
               response.complete(jaxrs);
            }
            catch (Exception e)
            {
               response.completeExceptionally(e);
            }
         }
      };
      t.start();
      return response;
   }
}