非同期処理
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 です。