サービス コントロールをカスタマイズする : メソッドとコールバックをバッファリングする
このトピックでは、サービス コントロールのデフォルト動作を変更するための CTRL ファイルのカスタマイズについて説明します。
コントロールに関する詳細については、コントロール : Web サービスからリソースを使用するを参照してください。
サービス コントロールの詳細については、サービス コントロール : 他の Web サービスを使用するを参照してください。
サービス コントロールのカスタマイズの詳細については、サービス コントロールをカスタマイズする : 概要を参照してください。
メッセージ バッファの詳細については、非同期メソッドを使用するを参照してください。
メッセージ バッファは、戻り値の型が void であるメソッドおよびコールバックにのみ追加できます。
メッセージ バッファは、サービス コントロールのメソッドおよびコールバック ハンドラに追加できます。メッセージ バッファをサービス コントロールに追加すると、何が起こるかを理解しておく必要があります。サービス コントロールは別の Web サービス(対象のサービス)のプロキシです。多くの場合、対象のサービスはリモート サーバ上に配置されています。メッセージ バッファをサービス コントロールに追加すると、バッファリングは必ずローカル サーバ上の処理となります。
次に示すように、デザイン ビューでは、メッセージ バッファはメソッドまたはコールバック上の「バネ」アイコンとして描かれます。
メッセージ バッファは、線上の(サービスに)近い方に描かれます。一般に、リモート Web サービスの実行環境またはコンフィグレーションを管理することはできません。つまり、線上の(サービスから)遠い方で行われる処理を変更することはできません。
メッセージ バッファをメソッドに追加すると、メソッドは非同期となります。つまり、そのメソッドの呼び出し側は応答を待機しません。
サービス コントロールでは、自分の Web サービスから他のサービスに出力メッセージ(サービス コントロール メソッドの呼び出し)を送信する場合、自分のサービスがクライアントとなり、他のサービスが自分のサービスに入力メッセージ(サービス コントロールのコールバック)を送信する場合、他のサービスがクライアントとなります。
メッセージ バッファをサービス コントロールのメソッドに追加すると、出力メッセージ(メソッドの呼び出し)はローカル マシン上にバッファリングされます。メソッドの呼び出しは直ちに復帰します。これにより、メッセージをリモート サーバに送信してから void 応答を受信するまでサービスが待機する必要がなくなります。つまり、サービスはネットワーク通信が往復するまで待機する必要がありません。
メッセージ バッファをサービス コントロールのコールバックに追加すると、入力メッセージ(コールバックの呼び出し)はローカル マシン上にバッファリングされます。コールバックの呼び出しは直ちに他の Web サービスに復帰します。これにより、自分のサービスがリクエストを処理するまで他のサービスを待機させずに済みます。ただし、バッファリングは線上の(サービスに)近い方で行われるので、void 型の戻り値が返される場合でも、呼び出し側サービスはネットワーク通信が往復するまで待機しなければなりません。しかし、自分のサービスがメッセージを処理するまで、呼び出し側サービスを待機させる必要はありません。
サービス コントロールのメソッドおよびコールバック ハンドラがメッセージ バッファを使用するように指定するには、2 通りの方法があります。
デザイン ビューで、メソッドまたはコールバックを選択します。タスク ペインで、[このメソッドをバッファする] を開始するタスクを選択します。
デザイン ビューで、メソッドまたはコールバックを選択します。プロパティ ペインで、message-buffer プロパティを展開し、enabled 属性を true に設定します。
これらの操作により、サービス コントロールの CTRL ファイルに適切なコメントが付けられます。次の節では、追加されるコメントについて説明します。
メッセージ バッファをコードで指定するには、@jws:message-buffer Javadoc タグを使用します。サービス コントロールの CTRL ファイルでは、@jws:message-buffer タグをメソッドまたはコールバックに配置できます。
@jws:message-buffer タグの詳細については、@jws:message-buffer タグを参照してください。
次の例では、@jws:message-buffer タグがサービス コントロールのメソッドに含めています。
public interface QuoteServiceControl extends ServiceControl { ... /** * @jws:message-buffer enable="true" */ public void getQuote (int customerID, java.lang.String tickerSymbol); ... }
次の例では、@jws:message-buffer タグがサービス コントロールのコールバックに含めています。
public interface QuoteServiceControl extends ServiceControl { ... public interface Callback { /** * @jws:message-buffer enable="true" */ public void onQuoteReady (java.lang.String tickerSymbol, double dQuote); } ... }