非同期処理

JAX-RS 2.0 の非同期処理の技法を使用してスレッドを処理できます。非同期処理は、 Client API と Server API の両方でサポートされています。クライアント API およびサーバー API での非同期処理について詳しくは、「JSR 339: JAX-RS 2.0: The Java API for RESTful Web Services」(「仕様」) の第 8 章を参照してください。

以下の 2 つの例は、クライアント API とサーバー API での非同期処理を示しています。
  • クライアント API での非同期処理
    Client client = ClientBuilder.newClient();
    WebTarget target = client.target("http://example.org/customers/{id}");
    target.resolveTemplate("id", 123).request().async().get(
       new InvocationCallbackCustomer() {       
              @Override
               public void completed(Customer customer) { 
                  // Do something 
               }       
              @Override 
               public void failed(Throwable throwable) {
                  // Process error 
               } 
    }); 
  • サーバー API での非同期処理
    @Path("/async")
    public class MyResource{
    
              @GET
               public void getAsync(@Suspended final AsyncResponse asyncResponse){ 
                  CompletionCallback callBack = new CompletionCallback(){		
    	                    @Override
    	                    public void onComplete(Throwable throwable) {
    	                          	...
    	                    }
    		             };		 
    	            asyncResponse.register(callBack);	    
    	            asyncResponse.resume("some Response");		    
    	         }
    }
Liberty での JAX-RS 2.0 実装は、EJB をサポートし、 また、ステートレス・セッション Bean およびシングルトン・セッション Bean をルート・リソース・クラスとして使用することをサポートします。 EJB メソッドが @Asynchronous アノテーション付きである場合、 EJB コンテナーは自動的にその実行のための必要なリソースを割り振ります。したがって、このシナリオでは、 非同期応答を生成するために Executor を使用する必要はありません。以下に例を示します。
@Stateless
@Path("/")
class EJBResource {

	@GET @Asynchronous
	public void longRunningOp(@Suspended AsyncResponse ar) {
		executeLongRunningOp();
		ar.resume("Hello async world!");
	}
}
このケースでは、明示的なスレッド管理は、EJB コンテナーの制御下にあるため必要ありません。応答は、 注入された AsyncResponse での resume の呼び出しによって生成されます。したがって、longRunningOp の戻りの型は void です。

トピックのタイプを示すアイコン 参照トピック

ファイル名: rwlp_jaxrs2.0_asyn.html