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);
  }
}
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.