会話を実装する
このトピックでは、会話をサポートする Web サービスの構築に関する情報を提供します。会話は、WebLogic Server でサービスのステート関連データを維持し、サービス、クライアント、およびリソース(他のサービスなど)の間の通信を相関させることができるようにする技術の一要素です。
非同期のサービス、または単一リクエストでクライアントとの通信が複数に及ぶサービスなど、あらゆるサービス設計で会話をサポートすることを検討してください。WebLogic Server では、会話をサポートするサービスはサポートしないサービスとは異なる方法で扱われます。会話を開始するようにマークされたサービスの処理がクライアントから呼び出されると、WebLogic Server では会話コンテキストを作成します。そのコンテキストは、サービスへの呼び出しとサービスからの呼び出しを相関させたり、ステート関連データを保持したりするために使用します。
コンテキストは、会話で提供されるメリットのカギとなります。概念的に言うと、複数の関連する 1 つの Web サービスへの呼び出しまたは 1 つのサービスからの呼び出しは、同じ初期リクエストに関連しているという理由で同じコンテキストに属します。WebLogic Workshop では、会話を使用することでこの概念的な現実をサポートするサービスを容易に構築できます。
会話が開始されると、WebLogic Server では以下のことが行われます。
会話のスコープを管理するためのコンテキストを作成する
コンテキストを識別するための会話 ID を生成する
シリアライズ可能なメンバー変数に格納されるデータを含む、サービスのステートを保存する
アイドル時間を測定する内部タイマーをスタートさせる
会話の存続期間を測定する内部タイマーをスタートさせる
会話 ID、永続データ、アイドル時間、存続期間といった各情報は、会話のコンテキストの一要素です。特に会話 ID は、Web サービスが通信に利用する XML メッセージでクライアントに渡されます。会話 ID は、リソースの呼び出しでも渡されます。それ以降の Web サービスに対する各会話呼び出しでは、会話 ID は呼び出しを適切な会話コンテキスト(言い換えると、サービスの適切なインスタンスと、それが現時点で保持しているステート)と関連付けるために使用します。
会話をサポートするサービスを構築するときには、会話の以下の特性に注意してください。
会話コンテキストのスコープは、そのサービスだけに限定される
たとえば、会話の過程で別のサービスのメソッドを呼び出したからと言って、その別のサービスのステートが保持されるということはありません。会話のあるなしに関係なく、そのもう一方のサービスがそれ自身のステートを維持しなければなりません。
会話をサポートする 2 つのサービスの相関関係は、WebLogic Server によって自動的に処理される
つまり、会話をサポートしているサービスが会話をサポートしている別のサービスの会話メソッドを呼び出した場合は、WebLogic Server がそれら 2 つの別々のコンテキストを自動的に相関させます。
自分のサービスと、会話をサポートしていないように思われるサービスの間で、会話が正しく相関させられるものと当然のように考えるのは避ける
サービスのステートは、会話フェーズ属性「start」、「continue」、または「finish」でマークされたメソッドまたはコールバック ハンドラが正常に完了したときのみ更新される
以上の注意事項は、サービスの内部メソッド(処理ではなくしたがって会話メソッドにはならない)および他の Web サービスでエクスポーズされたメソッドには関係ありません。
会話のサポートの追加は、通常は、会話フェーズ属性(後述)でメソッドおよびコールバックにマークを付けるだけで済みます。とは言っても、会話で使用するようにマークを付けるメソッドおよびコールバック ハンドラのコードを記述するときには、以下の事項に注意する必要があります。
会話のメソッドおよびコールバック ハンドラから送出された例外は必ず処理する
会話のメソッドまたはコールバック ハンドラから送出された未処理の例外は、そのメソッドまたはハンドラからのステートの更新をすべて取り消してしまいます(つまりステート データがシリアライズされない)。会話のメソッドおよびコールバック ハンドラの例外処理を設計するときには、その例外に対する適切な応答とは何なのかを考える必要があります。JwsContext インタフェースは、処理(@jws:operation タグでマークされたメソッド)またはコールバック ハンドラから例外が送出されたときに呼び出される onException コールバック ハンドラを提供します。サービスの設計次第で、onException ハンドラのコードでは以下のことが行われます。
アプリケーション ログにエラーを記録する
クライアントに障害を通知する
会話を終了する
会話のメソッドとコールバックは短命でなければならない
特定の時点で会話内で実行できるメソッドまたはコールバックは 1 つだけです。一方でこれは、新しい呼び出しがすでに処理されている呼び出しを干渉することがないという意味でメリットとなります。他方では、現在の呼び出しが処理を終了するまで新しい呼び出しがブロックされるので、短い時間で実行が完了するように各メソッドまたはコールバックを実装する必要があります。
ステート関連データを保持する変数でシリアライゼーションのサポートを確実に行う
Java において、シリアライゼーションはオブジェクト インスタンスに関する情報をディスクに書き込めるようにする技術です。ほとんどの場合で、この要件は特別な作業の必要なく満たすことができます。詳細については、シリアライゼーションをサポートするを参照してください。
会話の一部ではないコード内からステートを保存しない
サービスでステートを保存する必要がある場合は、会話を開始または続行するメソッド内からメンバー変数に書き込むことでステートを保存するようにします。
メソッドまたはコールバックに会話のフェーズ属性を適用すると、そのメソッドまたはコールバックは会話内で役割があるものとして識別されます。属性は、デザイン ビューでプロパティ ペインを使用して適用できます。対話のフェーズ プロパティを設定すると、次のような対応するタグがサービスのソース コードのメソッドまたはコールバックの宣言の直前に挿入されます。
@jws:conversation phase="start"
会話のフェーズ属性に設定できる値は以下のとおりです。
start
continue
進行中のリクエストに関連してクライアントとの通信に使用される可能性のあるすべてのメソッドまたはコールバック(会話が開始されてから終了するまでの間に呼び出されるように意図されたメソッド)でフェーズ属性を「continue」に設定します。
finish
JwsContext インタフェースの finishConversation メソッドを呼び出して会話を終了することも可能です。詳細については、会話の有効期間を管理するを参照してください。
none
会話のフェーズ属性で会話のサポートを追加する方法の詳細については、会話のサポートを追加するにはを参照してください。
コントロールがどのように実装されたのかを知っていない限りは、コントロールでエクスポーズされたメソッドおよびコールバックに会話のフェーズ属性を適用しないでください。
言い換えると、通常は、デザイン ビューの右側に表示されるアイテムの会話フェーズ属性は変更しません。別のサービスなどのリソースに対応するコントロール(CTRL)ファイルをインポートする場合、デザイン ビューにおけるそのイメージは会話サポートの有無および方法を示します。コントロールは単にリソースそれ自体のプロキシに過ぎないので、その会話サポートを「変更」すると予期せぬ動作が生じる場合があります。