以下にユーザが作成しますユーザサービス処理部とコンポーネントトランザクションサービスライブラリで提供します出口プログラムの作成について説明します。
■ユーザサービス処理部
サーバアプリケーションの処理を、オペレーティングシステムに添付されているエディタなどを使用して記述します。
トランザクションアプリケーションを使用してグローバルトランザクション運用を行う場合、トランザクション命令、およびリソースマネージャを使用するために必要な処理(データベースの結合、切り離し文)を記述する必要はありません。
アプリケーションが異常などを検出しロールバックさせたい場合には、アプリケーションの復帰値に10000を設定してください。アプリケーションの復帰値によるクライアントの処理を以下に示します。
■クライアント側でトランザクションの開始・終了を行う場合
システムとしては、コミットおよびロールバック処理を行いません。コミット、およびロールバックはクライアントのアプリケーションが発行します。
■サーバ側でトランザクションの開始・終了を行う場合
クライアントアプリケーションがトランザクションを開始しなければ、サーバ側でシステムが、トランザクションを開始、終了する制御を行います。この場合、サーバアプリケーションまたはシステムで設定する復帰値で、以下に示す動作を行います。復帰値は、Interstageにより規定されています。
復帰値 | トランザクションの状態 | 意味 | アプリケーションの指定可否 |
---|---|---|---|
0 | コミット | 正常 | 可 |
1~9999 | コミット | サーバアプリケーション任意 | 可 |
10000 | ロールバック | サーバアプリケーションで異常検出 | 可 |
10001(注) | ロールバック | システム異常 | 不可 |
10002(注) | ロールバック | システムで異常検出 | 不可 |
10003(注) | ロールバック | 通信処理異常 | 不可 |
10004(注) | ロールバック | サーバアプリケーションで異常またはトランザクションタイムアウト | 不可 |
| ロールバック | AIM連携のセション継続機能において異常検出 | 不可 |
10006(注) | ロールバック | アクセス制御において異常検出 | 不可 |
10007(注) | ロールバック | プロセスバインド機能において異常検出 | 不可 |
10008(注) | ロールバック | 最大キューイング数に達した | 不可 |
注)クライアントに復帰値10001~10008が通知された場合は、同時にその異常の詳細がエラーログに記録されます。
C:\Interstage\td\trc\lorb\errlog0
/var/opt/FSUNtd/trc/lorb/errlog0
/var/opt/FJSVtd/trc/lorb/errlog0
■出口プログラムの設定方法
C++言語で出口プログラムを使用する場合、以下の方法を使用してください。C++言語の場合は、C言語またはCOBOLのように、ワークユニット定義に前出口プログラム名、後出口プログラム名および異常出口プログラム名を記述する必要はありません。ただし、出口プログラム最大処理時間については、ワークユニット定義に記述してください。
なお、異常出口プログラムは、プロセスバインド機能を使用する場合にのみ有効となります。
■ヘッダの修正
tdcコマンドによりスケルトンのソースを生成する場合、スケルトンのソースと共に、以下の形式の名前でincludeファイルが出力されます。
TD_オブジェクト名_proto.h
出口プログラムを使用する場合、TD_オブジェクト名_proto.hのファイルを修正する必要があります。
前出口プログラムを使用する場合は、includeファイル内の"long ApmInit();"のコメントを削除してください。
class ExtpApmUser:public ExtpApmBase{ public: long ApmInit(); // long ApmRecover(); // long ApmDestroy(); };
後出口プログラムを使用する場合は、includeファイル内の"long ApmDestroy();"のコメントを削除してください。
class ExtpApmUser:public ExtpApmBase{ public: // long ApmInit(); // long ApmRecover(); long ApmDestroy(); };
異常出口プログラムを使用する場合は、includeファイル内の"long ApmRecover();"のコメントを削除してください。
class ExtpApmUser:public ExtpApmBase{ public: //long ApmInit(); long ApmRecover(); //long ApmDestroy(); };
前出口プログラム、後出口プログラムおよび、異常出口プログラムを使用する場合は、includeファイル内の"long ApmInit();"、"long ApmDestroy();"および、"long ApmRecover();"のコメントを削除してください。
class ExtpApmUser:public ExtpApmBase{ public: long ApmInit(); long ApmRecover(); long ApmDestroy(); };
前出口プログラム名は"ApmInit"、後出口プログラム名は"ApmDestroy"、異常出口は"ApmRecover"という固定名で作成する必要があります。そのため、出口プログラムを作成する場合、以下のように記述する必要があります。
#include "TD_オブジェクト名_proto.h" long ExtpApmUser::ApmInit(){ // 前出口の処理 };
#include "TD_オブジェクト名_proto.h" long ExtpApmUser::ApmDestroy(){ // 後出口の処理 };
#include "TD_オブジェクト名_proto.h" long ExtpApmUser::ApmRecover(){ // 異常出口の処理 };
IDL定義とサーバアプリケーション名の関係を以下に示します。
モジュール名_インタフェース名_impl::オペレーション名
注意
サーバアプリケーションにおいて、引数に指定するオブジェクト情報は設定されていません。