会話の有効期間を管理する

会話に参加しているサービスに関して、その会話のさまざまな側面(存続期間やアイドル時間など)は WebLogic Server によって管理されます。JwsContext インタフェースでエクスポーズされたメソッドおよびコールバックを使用すると、実行時にそれらの側面の管理と応答を行うコードを記述できます。

これは、サービスで実行された特定のアクションに応じて会話の有効期間を管理する値を変更するようなロジックを提供する場合に便利です。たとえば、特定のプロセスで完了に時間がかかる場合には最大の存続期間またはアイドル時間(あるいは両方)を長くすることができます。または、会話を直ちに終了することもできます。

会話の終了間際に実行されるコードを記述することもできます。そのようなコードでは、サービス後にクリーンアップを実行したり、取得したリソースを解放したり、あるいは会話が終了することをクライアントに通知したりすることができます。

新しい Web サービス(JWS ファイル)を作成する場合、ソース コードには自動的に次の記述が挿入されます。

/** @jws:context */ 
weblogic.jws.control.JwsContext context; 

@jws:context Javadoc タグは、Web サービスのステートを管理したり、呼び出しを相関させたりするためのコンテキストを作成するように指定します。JwsContext 変数が宣言されることで、JwsContext インタフェースでエクスポーズされたメソッドを呼び出したり、コールバックを処理したりするコードを記述できます。

注意: JwsContext 変数がコード中にあると、WebLogic Workshop の構造ペインでインタフェースのメソッドとコールバックのリストを表示できます。

この JwsContext 変数を使用すると、以下のようにして会話の有効期間を管理できます。

会話のアイドル状態の時間を制御する

最大のアイドル時間とは受信メッセージ間に待機できる時間のことで、この時間を過ぎるとサービスの会話は自動的に終了し、WebLogic Server によってメモリから削除されます。

会話がアイドル状態を維持できる最大の時間(この時間を過ぎると会話が自動的に終了される)を変更するコードを記述できます。最大のアイドル時間を変更するコードを記述すると、クライアントが処理を完了させるために利用できる時間を増やすことができます。たとえば、コードからクライアントに対して非同期の追加リクエストが行われ、その応答に要する時間が最大のアイドル時間よりも長いと思われる場合は最大アイドル時間を一時的に増やすことができます。そのクライアントが応答した時点で、コードでは最大アイドル時間を更新して元の短い方の時間に戻すことができます。

注意: アイドル時間をトラッキングするタイマーは、クライアントとの対話でのみリセットされます。たとえば、サービスが別の Web サービス(デザイン ビューでサービスの右側に表示されるエンティティ)からコールバックを受信したときにはタイマーはリセットされません。そのような状況でアイドル タイマーをリセットするには、コールバック ハンドラで JwsContext インタフェースの resetIdleTime メソッドを呼び出します。

設計時に最大アイドル時間の初期値を設定する

最大アイドル時間の初期値は、デザイン ビューでサービス領域をクリックし、プロパティ ペインを使用して conversation-lifetime max-idle-time 属性を設定することで設定できます。

この属性のデフォルト値は「0」です。デフォルトでは、会話は無限にアイドル状態を維持できます。通常は、サービスがアイドル状態を続ける適当な時間を見積もり、それからこの属性を他の値に設定してください。会話がアイドル状態を長く続けられるようにすると、特に、(アイドル状態のタイムアウト値が無限の状態で)サービスの新しい呼び出しによって新しい会話コンテキストが作成されるときにシステム リソースが大量に消費されます。

max-idle-time 属性を変更すると、次のような Javadoc タグでサービスのクラスにマークが付けられます。この例では、値が「2 minutes」に設定されます。

/**
 * @jws:conversation-lifetime max-idle-time="2 minutes"
 */

この属性で指定された値は、このサービスで会話が開始されたときの最大アイドル時間の開始値になります。この値は、それ以後サービスのコードを通じて更新できます。

注意: 初期値は、ソース コードで Javadoc タグを変更するか、プロパティ ペインを使用して変更できます。一方の方法で変更を行うと、他方でもそれが自動的に反映されます。また、プロパティ ペインを使用してデフォルト値「0」を変更するまでは、Javadoc タグはソース コードに追加されません。

@jws:conversation タグのリファレンス情報については、@jws:conversation-lifetime タグを参照してください。

実行時に最大アイドル時間の値を変更する

実行時に最大アイドル時間を管理するには、以下の JwsContext メソッドを使用します。

データベースのクエリが行われる次の例では、そのクエリの結果が返されるまで 5 分は待つように最大アイドル時間を設定します。

public void getEmployeeContactInfo(String employeeID)
{
    context.setMaxIdleTime("5 minutes");
    Employee m_contactInfo = 
        employeeDataControl.getContactInformation(employeeID);
}

会話の期間を制限する

会話の最大存続期間とは、会話が開始されてから終了するまでの時間間隔のことです。この時間を過ぎると、会話は WebLogic Server によって終了され、メモリから削除されます。

最大の存続期間を変更するコードを記述できます。これは、たとえばクライアントに応答を返すためにサービスによって行われる複数の一体となったアクションが元々考えられていたより長い時間かかるような場合に便利です。

設計時に最大存続期間の初期値を設定する

最大存続期間の初期値は、デザイン ビューでサービス領域をクリックし、プロパティ ペインを使用して conversation-lifetime max-age 属性を設定することで設定できます。

この属性のデフォルト値は「1 day」です。デフォルトでは、会話は開始から 1 日で自動的に終了します。通常は、サービスがアクティブ状態を続ける適当な時間を見積もり、それからこの属性をその値に設定してください。会話がアクティブな状態を長く続けられるようにすると、特に、サービスの新しい呼び出しによって新しい会話コンテキストが作成されるときにシステム リソースが大量に消費されます。

max-age 属性を変更すると、次のような Javadoc タグでサービスのクラスにマークが付けられます。この例では、値が「7 days」に設定されます。

/**
 * @jws:conversation-lifetime max-age="7 days"
 */

この属性で指定された値は、このサービスで会話が開始されたときの最大存続期間の開始値になります。この値は、それ以後サービスのコードを通じて更新できます。

注意: 初期値は、ソース コードで Javadoc タグを変更するか、プロパティ ペインを使用して変更できます。一方の方法で変更を行うと、他方でもそれが自動的に反映されます。また、プロパティ ペインで max-age のデフォルト値を変更するまでは、Javadoc タグはソース コードに追加されません。

@jws:conversation-lifetime タグのリファレンス情報については、@jws:conversation-lifetime タグを参照してください。

実行時に最大存続期間の値を変更する

実行時に会話の最大存続期間を管理するには、以下の JwsContext メソッドを使用します。

次のシンプルな例は、最大の存続期間を、クライアントがリクエストに関連する詳細情報を収集して復帰するまでの時間が確保されるように設定する方法を示しています。会話の存続期間を延長することで、サービスのコンテキスト(およびこれまでに生じた永続的なステート)がクライアントの復帰までアクティブ状態でいられるようになります。

public void needMoreInfo(String neededInfoDescription)
{
    context.setMaxAge("2 days");
    callback.onRequestMoreInfo(neededInfoDescription);
}

会話を終了する

会話が終了すると、WebLogic Server によってメモリから削除されるように会話コンテキストにマークが付けられます。つまり、その永続的なステートの一部であるデータが削除されることになります。会話は、以下のいずれかの時点で終了します。

最後のケース以外では、実際には会話はすぐに終了しない可能性があります。破棄のマークが付けられても、WebLogic Server が実際に会話コンテキストを削除するまでには時間がかかることがあります。

他方、finishConversation メソッドの呼び出しは、finishConversation が呼び出されたメソッドまたはコールバックが復帰した時点で会話の終了(およびその後の WebLogic Server によるクリーンアップ)を引き起こします。会話の終了は、クライアント リクエストやステートの変化などのイベントに応じて直接行うのが便利です。会話を適時に確実に行う必要がある場合は、finishConversation メソッドを呼び出してください。

会話の終了時に処理を行う

会話の終わり方に関係なく、会話の終了時に実行されるコードを記述することができます。そのためには、コードを JwsContext_onFinish コールバック ハンドラに追加します。このハンドラは、会話をサポートするどのサービスにでも追加できます。

会話が終了すると、コールバック ハンドラは会話が期限切れで終了したのかどうかを示すブール値を受信します。会話は、サービスの conversation-lifetime プロパティの max-age 属性で設定された値を超えたときに期限切れになります。また、サービスのアイドル状態が conversation-lifetime プロパティの max-idle-time 属性で設定された値を超えたときにも期限切れになります。

ハンドラは、JwsContext.finishConversation メソッドの呼び出しが原因で会話が終了した場合には false を受信します。また、false 値は、会話プロパティのフェーズ属性が finish に設定されているアイテム(メソッドやコールバックなど)の実行を通じて会話が終了したことも示します。

会話の終了を処理するコードを追加するには

  1. weblogic.jws.control.JwsContext として宣言された変数を見つけます。
    会話のサポートを追加すると、会話の有効期間を管理するために使用できる変数が自動的にコードに追加されます。この変数は、次のように追加されます。

/** @jws:context */ weblogic.jws.control.JwsContext context;

  1. 与えられた変数名(ここでは context)を使用して、JwsContext インタフェースでエクスポーズされた onFinish コールバックのコールバック ハンドラを追加します。
    コールバック ハンドラの宣言は次のようになるはずです。

public void context_onFinish(boolean expired) { }

  1. 括弧の中に、会話の終了時に実行するコードを追加します。
    たとえば、デバッグを目的として、会話の終わり方を示すためにコンソールにメッセージを書き込みたい場合は、ハンドラを次のように実装します。

public void context_onFinish(boolean expired) {    String finishStatus = "";    if(expired){        finishStatus = "Conversation expired.";    }    else{        finishStatus = "Conversation finished normally.";       }    System.out.println(finishStatus);     }

関連トピック

会話の存続期間

会話を実装する

JwsContext インタフェース

@jws:conversation-lifetime タグ