非同期メソッドを使用する

非同期のメソッドおよびコールバックはすぐに呼び出し側に復帰するので、呼び出し側の Web サービスまたはアプリケーションでは他の処理をその完了まで継続できます。その非同期性はメッセージ バッファを使用して実現されるので、非同期のメソッドおよびコールバックはバッファリングという言葉で表現されることもあります。メソッドおよびコールバックをバッファリングすると、Web サービスで高負荷に対応しやすくなります。

メッセージ バッファは、戻り値の型が void であるメソッドおよびコールバックにのみ追加できます。メッセージ バッファのあるメソッドまたはコールバックが呼び出されるときには、そのメソッドまたはコールバックの呼び出しを表すメッセージが、Web サービスまたはクライアントがアクセス可能になったときに配信されるようにキューに配置されます。キューはメッセージのセマンティクスまたは送り先ソフトウェア コンポーネントについての情報を持たないので、呼び出し側に何か意味のあるものが返されることはありません。キューは常に void を返さなければならないので、バッファリングされたメソッドまたはコールバックは void を返す必要があります。

メッセージ バッファは、Web サービスのメソッドおよびコールバック ハンドラに追加できます。ただし、メッセージ バッファを追加したときに何が起こるのかについては理解しておくことが重要です。バッファリングを提供するキューは、常に Web サービス側に存在します。WebLogic Server では、クライアントのインフラストラクチャでメッセージ バッファリングのようなコンフィグレーション アクションを生じさせることはできません。したがって、デザイン ビューは、ネットワークの Web サービスに最も近いエンドでメッセージ バッファの「スプリング」アイコンを描画します。

メッセージ バッファをメソッドに追加すると、メソッドは非同期となります。つまり、そのメソッドの呼び出し側は応答を待機しません。

Web サービス メソッドのメッセージ バッファ

メッセージ バッファを Web サービスのメソッドに追加すると、受信メッセージ(メソッドの呼び出し)がローカル マシンでバッファリングされます。メソッド呼び出しはすぐにクライアントに戻ります。これで、クライアントでは Web サービスのリクエスト処理を待たなくて済みます。バッファリングはネットワークの Web サービス側で行われるので、void が返されると言ってもクライアントはネットワークの往復分は待つ必要があります。ただし、Web サービスでメッセージが処理されるのを待つ必要はありません。

Web サービス コールバックのメッセージ バッファ

コールバックの場合は、あなたの Web サービスがクライアントとして機能します。Web サービスが、クライアントに送信メッセージ(コールバックの呼び出し)を送信します。クライアントは、コールバックの戻り値が格納された受信メッセージで応答します。

メッセージ バッファをコールバックに追加すると、送信メッセージ(コールバックの呼び出し)がローカル マシンでバッファリングされます。コールバックの呼び出しはすぐに復帰します。これにより、メッセージをリモート サーバに送信してから void 応答を受信するまでサービスが待機する必要がなくなります。つまり、サービスはネットワーク通信が往復するまで待機する必要がありません。

message-buffer プロパティ(@jws:message-buffer Javadoc タグ)

メッセージ バッファは、デザイン ビューで簡単にメソッドまたはコールバックに追加できます。バッファリングするメソッドまたはコールバックを選択します。次に、プロパティ エディタで message-buffer プロパティの enabled 属性を true に設定します。これで、ソース コードのメソッドまたはコールバックに先行する Javadoc コメントに Javadoc タグ @jws:message-buffer enabled-true が追加されます。

すべてのパラメータがシリアライズ可能でなければならない

バッファリングされるメソッドまたはコールバックにメソッド パラメータとして渡されるオブジェクトはすべてシリアライズ可能でなければなりません。メソッドおよびコールバックの呼び出しは、Java のシリアライゼーションを通じてキューに配置されます。

組み込み Java クラスの多くは最初からシリアライズ可能です。他のクラスのほとんどは、implements java.io.Serializable をクラス宣言に追加することで簡単にシリアライズ可能にできます。

たとえば、次の Person クラスがメソッド パラメータとして渡される場合は、太字部分を宣言に追加するだけで、バッファリングされるメソッドまたはコールバックにパラメータとして渡すことができます。

public static class Person implements java.io.Serializable
{
    public String firstName;
    public String lastName;
}

メソッドの実行順序

Web サービスでバッファリングされる(非同期)メソッドが定義される場合は、その Web サービスの設計者もクライアントもメソッドやコールバックの実行順序を推測することはできません。そのことは、バッファリングされるメソッドとされないメソッドが同じ Web サービスに共存する場合に特に顕著です。

同期メソッドの呼び出しは必ず到着の順に実行されます。しかし、同じ Web サービスでバッファリングされるメソッドも定義される場合、それらの呼び出しが同期メソッドや他のバッファされるメソッドとの関連でいつ行われるかは判別できません。

WebLogic Workshop の Web サービスは、シングルスレッドで順次的です。受信したメソッドやコールバックの呼び出し要求は、同じ会話内では現在実行中のメソッドやコールバック ハンドラに割り込むことはありません。

再試行動作を制御する

バッファリングされるメソッドの内部から、そのメソッドに関連する WebLogic Server の再試行動作を制御できます。メソッドが呼び出されても、リクエストがすぐに処理されることを望まない場合は、WebLogic Server が後でリクエストを再発行するように要求できます。そのためには、Web サービス メソッドの中から weblogic.jws.RetryException を送出します。

RetryException クラスのコンストラクタは、再試行の遅延を引数としてとります。

関連トピック

Web サービス構築ガイド

非同期性を利用して長期間の処理を実現する

非同期 Web サービス

会話を使用してステートを保持する