プロセスバインド機能を使用する場合、特別な注意が必要となります。
ここでは、プロセスバインド機能を使用するアプリケーションを作成する場合に必要となる注意点を説明しています。
クライアントオブジェクトの異常やクライアントの電源断などにより、クライアントオブジェクトが異常終了した場合、トランザクションアプリケーション内に異常終了したクライアントオブジェクト用の領域が残ってしまいます。
このために、プロセスバインド機能ではクライアント思考時間監視機能と異常出口を提供しています。
クライアント思考時間監視は、サーバオブジェクトを呼び出し、復帰した後、次の同一トランザクションアプリケーションを呼び出すまでの時間を監視します。
クライアントに制御が渡り、監視時間内に次の同一トランザクションアプリケーションが呼び出されない場合、システムは、クライアントにバインドされているトランザクションアプリケーションの異常出口をスケジュールします。
異常出口の登録方法については、トランザクションアプリケーション作成言語がC言語または、COBOL(COBOLはWindows(R)版、Solaris版のみです)の場合、本章を、アプリケーション作成言語がC++言語の場合、“3.3 サーバアプリケーションのソースの作成”を参照してください。
クライアント思考時間がワークユニット定義で定義した値(秒)を超過すると、異常出口がスケジュールされます。
異常出口では、セションID参照APIを発行することによりセションID(クライアント識別子)を参照することができます。
セションIDをキーにトランザクションアプリケーション内のタイムアウトとなったクライアントオブジェクト用の領域を解放してください。
異常出口では、タイムアウトとなったクライアントのセションIDをセションID参照APIを発行することにより知ることができます。そのため、プロセスバインド機能を使用しているトランザクションアプリケーションではメソッド間にまたがって使用する領域を獲得する場合、セションIDをキーに獲得した領域の管理が必要となります。
op1でクライアントオブジェクト固有の領域として獲得した領域は、op2で参照後、削除されるロジックとなっています。また、クライアントオブジェクトがop1を呼び出した後、op2を呼び出すまでに異常終了した場合、op1でクライアントオブジェクト固有の領域として獲得した領域は、サーバオブジェクトプロセスが終了するまで解放されなくなってしまいます。
領域をセションIDをキーに管理することにより、異常出口で領域を解放することが可能となります。
C言語・COBOLで作成したオブジェクトにおける異常出口の作成と登録
異常出口関数を作成します。異常出口では、以下のような処理を行うことが可能です。
セションID参照APIを発行することにより、セションIDの参照が可能です。
セションIDをキーに領域の解放が可能です。
標準エラー出力へのメッセージを出力することができます。
異常出口が正常終了(復帰値=0)した場合、次の通信を行います。
異常出口が異常終了(復帰値=0以外)した場合、異常出口が動作したトランザクションアプリケーションプロセスが異常終了します。
サーバプロセス異常終了時の動作は、“5.2.3.2 その他の注意点”を参照してください。
ワークユニット定義にて、異常出口名を定義します。詳細は、“OLTPサーバ運用ガイド”を参照してください。
なお、COBOLはWindows(R)版、Solaris版のみ使用できます。
C++言語で作成したオブジェクトにおける異常出口の作成と登録
異常出口関数を作成します。関数名は、“ApmRecover”固定です。
異常出口では、以下のような処理を行うことが可能です。
セションID参照APIを発行することにより、セションIDの参照が可能です。
セションIDをキーに領域の解放が可能です。
標準エラー出力へのメッセージを出力することができます。
異常出口が正常終了(復帰値=0)した場合、次の通信を行います。
異常出口が異常終了(復帰値=0以外)した場合、異常出口が動作したトランザクションアプリケーションのプロセスが異常終了します。
サーバプロセス異常終了時の動作は、“5.2.3.2 その他の注意点”を参照してください。
tdcコマンド実行時に生成される“TD_オブジェクト名_proto.h”の異常出口(ApmRecover)のコメントアウト記述を外します。
ワークユニット配下のユーザオブジェクトにインスタンスが残っている状態で、ワークユニットの通常停止を実行した場合、ワークユニットの通常停止はリジェクトされます。
この場合、ワークユニット配下のユーザオブジェクトのインスタンスがすべて削除されるまで待つか、必要に応じて、ワークユニットを強制停止してください。
同様に、活性変更コマンドもリジェクトされます。
ワークユニット定義で定義したパラメタ名のパラメタに値が設定されていない場合(0パディング)、バインドの必要がないと判断します(インスタンス管理を行いませんが、オブジェクト呼び出しは正常に行われます。インスタンスの継続は行えません。)。
バインドの開始は、“Method Name to Begin Session:”ステートメント に指定したメソッドとなります。
セションIDを採番するメソッドが、プロセスバインド機能を使用するオブジェクト内に含まれる場合、セションIDを採番するメソッドをプロセスバインドの範囲に含むことはできません。“Method Name to Begin Session:”ステートメントには、セションIDを採番した後に呼び出すメソッド名を指定してください。
サーバオブジェクト異常時(プロセス異常終了時)には、サーバオブジェクトにバインドされているインスタンスの情報がすべて破棄されます。この場合、サーバオブジェクトが異常となる原因となったクライアントオブジェクトは、アプリケーション異常(10004)で復帰します。異常となったサーバオブジェクトにバインドされている他のクライアントオブジェクトは、次回の要求時にセション異常(10007)で復帰します。
クライアント思考時間オーバによりインスタンスが削除されることがあるため、インスタンス管理機能を使用するオブジェクトでは、インスタンス内で獲得した領域は、デストラクタで返却するように作成してください。インスタンス用の領域をデストラクタで返却しない場合、メモリリークが発生します。
プロセスバインド機能を使用してインスタンスを保持している場合、そのインスタンスはInterstageシステム定義ファイルのシステム規模で決定する同時接続クライアント数のうち、1つの接続を占有した状態となります。そのため、サーバアプリケーションが同時に使用するインスタンス数は、同時接続クライアント数以下になるように設計してください。この同時接続クライアント数を超えて要求を受けると、クライアントオブジェクトには復帰値10002(システムで異常検出)で復帰します。
セションIDはワークユニットごとに管理します。そのため、同一ワークユニット内で同じセションIDを使用して複数のオブジェクトに対してインスタンスを生成することはできません。