Menu Close

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);
  }
}