Web サービスでは通常、Web サービスが常駐するクライアントとサーバ間の通信に HTTP を使用しています。HTTP はリクエスト応答プロトコルであり、それぞれのオペレーションは、クライアントからサーバに送信されるリクエスト メッセージと、続いてサーバからクライアントに返される応答メッセージという、一組の要求と応答で構成されています。オペレーションを正常に完了するには、サーバが常に応答を送信する必要があります。リクエスト中はクライアントがサーバと同期を取るため、そのようなリクエストを同期といいます。サーバが応答するまで、あるいはリクエストがタイムアウトになるまで (所定の時間内に応答が受信されない場合、クライアントはタイムアウトになることがあります)、クライアントは処理を続行できません。
Web サービスが実行するオペレーションの中には、時間がかかるものもあります。銀行のローン決済担当者による承認など、人間の対話が介在するオペレーションの場合は、完了までに数日かかることもあります。個別のリクエスト応答サイクルを数日に設定できるようにするのは、設計として好ましくないといえます。そのようなリクエストにしたら、クライアント ホストとサーバ ホストの両方で、リソースを不必要に消費することになります。
Workshop と WebLogic Server では、Web サービスを非同期にできます。つまり、Web サービスは最初のリクエストの後にクライアントから切り離され、最終応答の準備ができるとクライアントをコールバックします。このように設計すると、要求されたオペレーションをアプリケーションが実行している間にも、クライアントが他のオペレーションを続行するようにできます。また、クライアントとアプリケーションの間での各リクエスト応答対話が、できるだけ短いものになります。友人に電話をかけて情報を教えてもらう場合を考えてみましょう。友人がすぐに答えを教えることができない場合、通話状態のまま何時間も待ったりはしません。代わりに、情報が得られたら折り返し電話してくるよう頼みます。
非同期 Web サービスは、クライアントからのリクエストを受け入れるメソッドを提供します。このときクライアントは、オペレーションを開始しても、完了するまで待機しません。このようなメソッドは通常、すぐに復帰します。そのとき、最初のリクエスト応答対話の応答部分が入力されますが、要求されたオペレーションの実際の結果は入力されません。また、サービスは、長時間かかるオペレーションの結果が得られたら、その結果をクライアントに送信するというコールバック メソッドも提供します。
次の図に、初期化メソッドとコールバック メソッドという 2 つのメソッドを備えた Web サービスを示します。クライアント (通常 Web サービス コントロール) は、requestMessage を呼び出して Web サービスのメイン プロセスを初期化します。メイン プロセスが完了 (応答を作成) したら、onMessage コールバック メソッドが呼び出され、応答がクライアントに返されます。
コールバック メソッドを Web サービスに追加するには、Web サービスのソース コードを右クリックして、[挿入|コールバック] を選択します。1 つのコールバック メソッドを含むデフォルトのコールバック インタフェースが追加されます。コールバック メソッドのデフォルト名は newMethod() です。次に示す例では、デフォルトのメソッド名が sendMessage() に変更されています。
@WebService public class HelloWorldWebService { @Callback private CallbackSvc callback; @WebMethod public void requestMessage() { } @CallbackService public interface CallbackSvc extends CallbackInterface { @WebMethod public void onMessage(); } }
複数のコールバック メソッドをコールバック インタフェースに追加できます。
コールバック メソッドに追加されるパラメータは、クライアントに送信されるデータを表します。たとえば、String という応答をクライアントに送信する場合、次のように String パラメータをコールバック メソッドに追加します。
@CallbackService public interface CallbackSvc extends CallbackInterface { @WebMethod public void sendMessage(String message); }
応答をクライアントに送信するには、コールバック インタフェースを宣言し、次にその宣言に基づいて適切なコールバック メソッドを呼び出す必要があります。
(1) コールバック インタフェースを宣言するには、@Callback アノテーションを使用します。この宣言は、[挿入|コールバック] コマンドによって自動的に追加されます。
@Callback private CallbackSvc callback;
(2) 次に、適切なコールバック メソッドを呼び出します。
@WebService public class HelloMessage { @Callback private CallbackSvc callback; @WebMethod public void initiateRequest() { callback.sendMessage("This is your callback message."); } @CallbackService public interface CallbackSvc extends CallbackInterface { @WebMethod public void sendMessage(String message); } }
通常、Web サービスは Web サービス コントロールを通してそのクライアントと通信します。
次の図に、Web サービス クライアント、サービス コントロール、および Web サービス間の関係を示します。
クライアント (一番左) は、メッセージを要求することによって対話を開始します。このリクエストは、Web サービス コントロールを介して Web サービスに渡されます。
Web サービスが応答を生成すると、その応答は元のクライアントに渡されます。このプロセスには 3 つの段階があります。最初の段階では、Web サービスがそのコールバックを呼び出し、そのコールバックが応答をコントロールに送信します。次の段階では、コントロールのイベント セット メソッドが応答をリスンしてクライアントに渡します。最後の段階では、クライアントのハンドラ メソッドがコントロールのイベント セット メソッドをリスンしてイベントを受け取ります。
Web サービスと Web サービス コントロールの関係の詳細については、「Web サービスのコールバック メッセージの処理」を参照してください。
クライアントと Web サービス コントロールの関係の詳細については、「サービス コントロールの作成と使用」を参照してください。
Web サービス コールバック メソッドの詳細については、「Web サービスのコールバック メソッドのテスト」を参照してください。