40.4. ポーリングアプローチを使用した非同期クライアントの実装

概要

ポーリングアプローチは、非同期アプリケーションを開発するための 2 つのアプローチのうちのより簡単なものです。クライアントが OperationNameAsync() という非同期メソッドを呼び出すと、応答をポーリングする Response<T> オブジェクトが返されます。クライアントが応答を待っている間に何をするかは、アプリケーションの要件によって異なります。ポーリングを処理するための 2 つの基本的なパターンがあります。

  • ノンブロッキングポーリング: ノンブロッキング Response<T>.isDone() メソッドを呼び出すことで、結果が準備できているかどうかを定期的に確認します。結果の準備ができている場合、クライアントはそれを処理します。そうでない場合、クライアントは他のことを続けます。
  • ブロッキングポーリング: Response<T>.get() をすぐに呼び出し、応答が到着するまでブロックします (任意でタイムアウトを指定します)。

非ブロッキングパターンを使用する

例40.6「非同期操作呼び出しのためのノンブロッキングポーリングアプローチ」 は、非ブロッキングポーリングを使用して、例40.1「非同期の例の WSDL コントラクト」 で定義されている greetMeSometime 操作で非同期呼び出しを行う方法を示しています。クライアントは非同期操作を呼び出し、結果が返されるかどうかを定期的にチェックします。

例40.6 非同期操作呼び出しのためのノンブロッキングポーリングアプローチ

package demo.hw.client;

import java.io.File;
import java.util.concurrent.Future;

import javax.xml.namespace.QName;
import javax.xml.ws.Response;

import org.apache.hello_world_async_soap_http.*;

public final class Client {
  private static final QName SERVICE_NAME
    = new QName("http://apache.org/hello_world_async_soap_http",
                "SOAPService");

  private Client() {}

  public static void main(String args[]) throws Exception {

    // set up the proxy for the client

    Response<GreetMeSometimeResponse> greetMeSomeTimeResp =
      port.greetMeSometimeAsync(System.getProperty("user.name"));

      while (!greetMeSomeTimeResp.isDone()) {
      // client does some work
      }
      GreetMeSometimeResponse reply = greetMeSomeTimeResp.get();
      // process the response

      System.exit(0);
  }
}

例40.6「非同期操作呼び出しのためのノンブロッキングポーリングアプローチ」 のコードは、以下を行います。

プロキシーで greetMeSometimeAsync() を呼び出す。

メソッド呼び出しは、Response<GreetMeSometimeResponse> オブジェクトを即座にクライアントに返します。Apache CXF ランタイムは、リモートエンドポイントからの応答受信および Response<GreetMeSometimeResponse> オブジェクト反映の詳細を処理します。

注記

ランタイムはリクエストをリモートエンドポイントの greetMeSometime() メソッドに送信し、呼び出しの非同期性の詳細を透過的に処理します。エンドポイント、したがってサービス実装は、クライアントが応答を待機する方法の詳細について心配することはありません。

返された Response オブジェクトの isDone() を確認して、応答が到達しているかどうかを確認します。

応答が到着していない場合、クライアントは再度チェックする前に作業を続行します。

応答が到達すると、クライアントは get() メソッドを使用して Response オブジェクトから取得します。

ブロッキングパターンの使用

ブロックポーリングパターンを使用する場合、Response オブジェクトの isDone() は呼び出されません。代わりに、リモート操作の呼び出し直後に Response オブジェクトの get() メソッドが呼び出されます。get() は、レスポンスが利用可能になるまでブロックします。

タイムアウトの制限を get() メソッドに渡すこともできます。

例40.7「非同期操作呼び出しのポーリングアプローチのブロック」 は、ブロッキングポーリングを使用するクライアントを示しています。

例40.7 非同期操作呼び出しのポーリングアプローチのブロック

package demo.hw.client;

import java.io.File;
import java.util.concurrent.Future;

import javax.xml.namespace.QName;
import javax.xml.ws.Response;

import org.apache.hello_world_async_soap_http.*;

public final class Client {
  private static final QName SERVICE_NAME
    = new QName("http://apache.org/hello_world_async_soap_http",
                "SOAPService");

  private Client() {}

  public static void main(String args[]) throws Exception {

    // set up the proxy for the client

    Response<GreetMeSometimeResponse> greetMeSomeTimeResp =
      port.greetMeSometimeAsync(System.getProperty("user.name"));
    GreetMeSometimeResponse reply = greetMeSomeTimeResp.get();
      // process the response
      System.exit(0);
  }
}