Oracle Tuxedoシステムには、ATMIサーバーを簡単に開発できるように、ATMIサーバーのロード・モジュール用に定義済の制御プログラムが提供されています。buildserver -C
コマンドを実行すると、制御プログラムが自動的にサーバーの一部として組み込まれます。
注: | 制御プログラムはシステムで提供されたものなので、変更することはできません。 |
定義済の制御プログラムは、アプリケーションへの参加と終了のほかに、サーバーにかわって次の操作を行います。
SIGHUP
シグナルを無視します。 SIGTERM
)を受信すると、終了処理を開始します。サーバーは停止され、必要な場合は再起動します。--
)までの引数を処理します。2つのダッシュは、システムで認識される引数の終わりを示します。TPSVRINIT
ルーチンを呼び出して、コマンド行で2つのダッシュ(--
)の後に入力された引数を処理したり、リソース・マネージャをオープンします(オプション)。このようなコマンド行の引数は、アプリケーション固有の初期化に使用されます。main()
は次の処理を行います。 main()
は次の処理を行います。 TPSVRDONE
を呼び出して必要な停止操作を行います。 以上からわかるように、main()
ルーチンは、アプリケーションへの参加と終了、レコードやトランザクションの管理、および通信に関する詳細を扱っています。
注: | システムで提供される制御プログラムは、アプリケーションへの参加と終了を行うため、TPINITIALIZE またはTPTERM ルーチンへの呼出しをコードに記述しないでください。この操作を行うと、ルーチンでエラーが発生し、TP-STATUS にTPEPROTO が戻されます。TPINITIALIZE またはTPTERM ルーチンの詳細は、『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の「クライアントのコーディング」を参照してください。 |
制御プログラムは、システムで提供される1つのATMIサーバーAUTHSVR
、および2つのサブルーチンTPSVRINIT
とTPSVRDONE
を提供します。次の項で説明するこれらの3つのデフォルト・バージョンについては、ご使用のアプリケーションに合せて変更できます。
注: | TPSVRINIT とTPSVRDONE を独自にコーディングする場合、この2つのルーチンのデフォルト・バージョンが、それぞれtx_open() とtx_close() を呼び出すことに注意してください。tx_open() ではなくtpopen() を呼び出すTPSVRINIT の新しいバージョンをコーディングする場合は、tpclose() を呼び出すTPSVRDONE もコーディングする必要があります。つまり、この2つのルーチンが呼び出すオープンとクローズのルーチンは対になっていなければなりません。 |
AUTHSVR(5)サーバーを使用すると、アプリケーションで各クライアントの認証を行うことができます。このサーバーは、アプリケーションのセキュリティ・レベルがTPAPPAUTH
、USER_AUTH
、ACL
、またはMANDATORY_ACL
に設定されている場合に、TPINITIALIZE
ルーチンによって呼び出されます。
AUTHSVR
のサービスは、USER-DATA-REC
レコードでユーザー・パスワードを確認します。このユーザー・パスワードは、TPINFDEF-REC
レコードのPASSWD
フィールドにあるアプリケーション・パスワードとは異なります。デフォルトでは、システムによってdata
から文字列が取得され、それと合致する文字列が/etc/passwd
ファイルで検索されます。
TPINITIALIZE
がネイティブ・サイトのクライアントから呼び出された場合、受信したUSER-DATA-REC
レコードはそのまま転送されます。そのため、アプリケーションでパスワードの暗号化が必要な場合、それに応じてクライアント・プログラムをコーディングする必要があります。
TPINITIALIZE
がワークステーション・クライアントから呼び出された場合、データは暗号化されてからネットワークに送信されます。
サーバーの起動時に、Oracle Tuxedoシステムの制御プログラムはその初期化時、つまりサービス・リクエストの処理を開始する前に、TPSVRINIT(3cbl)を呼び出します。
アプリケーションがこのルーチンのカスタム・バージョンをサーバーに提供していない場合は、制御プログラムで提供されるデフォルトのルーチンが使用され、このルーチンは、リソース・マネージャをオープンし、エントリを中央イベント・ログに記録してサーバーの起動が成功したことを示します。中央ユーザー・ログは自動的に生成されるファイルで、USERLOG (3cbl)ルーチンを呼び出して、プロセスがこのファイルにメッセージを書き込めるようにします。中央イベント・ログの詳細は、『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の「エラーの管理」を参照してください。
TPSVRINIT
ルーチンを使用すると、アプリケーションで要求される次のような初期化プロセスを行うことができます。
以降の項では、TPSVRINIT
を呼び出すことによって、これらの初期化プロセスがどのように行われるのかをサンプル・コードで示します。次のサンプル・コードでは示していませんが、このルーチン内ではメッセージ交換を行うこともできます。ただし、非同期応答が未処理のままでTPSVRINIT
ルーチンが制御を戻すと、このルーチンは失敗します。その場合、Oracle Tuxedoシステムでは応答は無視されて、サーバーが正常に終了します。
また、『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の「エラーの管理」に説明されているように、TPSVRINIT
ルーチンを使用して、トランザクションを開始したり終了することもできます。
TPSVRINIT
ルーチンの呼出しには、次のシグネチャを使用します。
LINKAGE SECTION.
01 CMD-LINE.
05 ARGC PIC 9(4) COMP-5.
05 ARGV.
10 ARGS PIC X OCCURS 0 TO 9999 DEPENDING ON ARGC.
01 TPSTATUS-REC.
COPY TPSTATUS.
PROCEDURE DIVISION USING CMD-LINE TPSTATUS-REC.
* User code
EXIT PROGRAM.
サーバーは、起動時に最初の処理として、構成ファイルに指定されているサーバー・オプションを読み取ります。これらのオプションは、引数の個数を格納するARGC
と、1つのSPACE
文字で区切られた引数を格納するARGV
を使用して渡されます。その後、定義済の制御プログラムがTPSVRINIT
を呼び出します。
次のサンプル・コードは、TPSVRINIT
ルーチンでコマンド行オプションを取得する方法を示しています。
IDENTIFICATION DIVISION.
PROGRAM-ID. TPSVRINIT.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. USL-486.
OBJECT-COMPUTER. USL-486.
*
DATA DIVISION.
WORKING-STORAGE SECTION.
*
LINKAGE SECTION.
*
01 CMD-LINE.
05 ARGC PIC 9(4) COMP-5.
05 ARGV.
10 ARGS PIC X OCCURS 0 TO 9999 DEPENDING ON ARGC.
01 SERVER-INIT-STATUS.
COPY TPSTATUS.
*
PROCEDURE DIVISION USING CMD-LINE SERVER-INIT-STATUS.
**********************************************************
* ARGC indicates the number of arguments and ARGV contains the
* arguments separated by a single SPACE.
**********************************************************
A-START.
*
. . . INSPECT the ARGV line and process arguments
IF arguments are invalid
SET TPEINVAL IN SERVER-INIT-STATUS TO TRUE.
ELSE arguments are OK continue
SET TPOK IN SERVER-INIT-STATUS TO TRUE.
*
EXIT PROGRAM.
次のサンプル・コードは、TPSVRINIT
のもう1つの使用法として、リソース・マネージャをオープンする方法を示しています。Oracle Tuxedoシステムで提供されるルーチンによって、リソース・マネージャ、TPOPEN(3cbl)およびTX OPEN(3cbl)がオープンされます。また、補助的なルーチンTPCLOSE(3c bl)とTXCLOSE(3 cbl)も提供されます。これらのルーチンを使用してリソース・マネージャをオープンしたりクローズするアプリケーションは、その意味では移植性があります。これらは、構成ファイルに設定されたリソース・マネージャのインスタンス固有の情報にアクセスすることによって動作します。
これらのルーチン呼出しは省略可能です。また、リソース・マネージャがデータベースの場合、リソース・マネージャ固有の呼出しがデータ操作言語(DML)の一部であるときは、その呼出しの代わりに使用できます。USERLOG(3cbl)ルーチンを使用して、中央イベント・ログに書き込んでいることに注目してください。
注: | コマンド行オプションを受け取り、データベースをオープンする初期化関数を作成するには、次のサンプル・コードと前述のサンプル・コードを組み合せます。 |
IDENTIFICATION DIVISION.
PROGRAM-ID. TPSVRINIT.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. USL-486.
OBJECT-COMPUTER. USL-486.
*
DATA DIVISION.
WORKING-STORAGE SECTION.
01 TPSTATUS-REC.
COPY TPSTATUS.
01 LOGMSG PIC X(50).
01 LOGMSG-LEN PIC S9(9) COMP-5.
*
LINKAGE SECTION.
01 CMD-LINE.
05 ARGC PIC 9(4) COMP-5.
05 ARGV.
10 ARGS PIC X OCCURS 0 TO 9999 DEPENDING ON ARGC.
01 SERVER-INIT-STATUS.
COPY TPSTATUS.
*
PROCEDURE DIVISION USING CMD-LINE SERVER-INIT-STATUS.
A-START.
. . . INSPECT the ARGV line and process arguments
IF arguments are invalid
MOVE "Invalid Arguments Passed" TO LOGMSG
PERFORM EXIT-NOW.
ELSE arguments are OK continue
CALL "TPOPEN" USING TPSTATUS-REC.
IF NOT TPOK
MOVE "TPOPEN Failed" TO LOGMSG
ELSE IF TPESYSTEM
MOVE "System /T error has occurred" TO LOGMSG
ELSE IF TPEOS
MOVE "An Operating System error has occurred" TO LOGMSG
ELSE IF TPEPROTO
MOVE "TPOPEN was called in an improper Context" TO LOGMSG
ELSE IF TPERMERR
MOVE "Resource manager Failed to Open" TO LOGMSG
PERFORM EXIT-NOW.
SET TPOK IN SERVER-INIT-STATUS TO TRUE.
EXIT PROGRAM.
EXIT-NOW.
SET TPEINVAL IN SERVER-INIT-STATUS TO TRUE
MOVE 50 LOGMSG-LEN.
CALL "USERLOG" USING LOGMSG
LOGMSG-LEN
TPSTATUS-REC.
EXIT PROGRAM.
初期化時にエラーが発生しないように、サーバーを終了してからサービス・リクエストの処理を開始するようにTPSVRINIT
をコーディングできます。
TPSVRINIT
がTPOPEN
を呼び出してリソース・マネージャをオープンするのと同じように、TPSVRDONE
ルーチンはTPCLOSE
を呼び出してリソース・マネージャをクローズします。
TPSVRDONE
ルーチンの呼出しには、次のシグネチャを使用します。
01 TPSTATUS-REC.
COPY TPSTATUS.
PROCEDURE DIVISION.
* User code
EXIT PROGRAM.
次のサンプル・コードは、TPSVRDONE
ルーチンを使用して、リソース・マネージャをクローズして終了する方法を示しています。
IDENTIFICATION DIVISION.
PROGRAM-ID. TPSVRDONE.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. USL-486.
OBJECT-COMPUTER. USL-486.
*
DATA DIVISION.
WORKING-STORAGE SECTION.
01 TPSTATUS-REC.
COPY TPSTATUS.
01 LOGMSG PIC X(50).
01 LOGMSG-LEN PIC S9(9) COMP-5.
01 SERVER-DONE-STATUS.
COPY TPSTATUS.
PROCEDURE DIVISION.
A-START.
CALL "TPCLOSE" USING TPSTATUS-REC.
IF NOT TPOK
MOVE "TPCLOSE Failed" TO LOGMSG
ELSE IF TPESYSTEM
MOVE "System /T error has occurred" TO LOGMSG
ELSE IF TPEOS
MOVE "An Operating System error has occurred" TO LOGMSG
ELSE IF TPEPROTO
MOVE "TPCLOSE was called in an improper Context" TO LOGMSG
ELSE IF TPERMERR
MOVE "Resource manager Failed to Open" TO LOGMSG
PERFORM EXIT-NOW.
SET TPOK IN SERVER-DONE-STATUS TO TRUE.
EXIT PROGRAM.
EXIT-NOW.
SET TPEINVAL IN SERVER-DONE-STATUS TO TRUE
MOVE 50 LOGMSG-LEN.
CALL "USERLOG" USING LOGMSG
LOGMSG-LEN
TPSTATUS-REC.
EXIT PROGRAM.
通信の詳細はOracle Tuxedoシステムの制御プログラムによって処理されるので、プログラマは通信の実装よりもアプリケーション・サービスのロジックに集中できます。ただし、システムで提供される制御プログラムと互換性を保つために、アプリケーション・サービスが特定の規約に従っている必要があります。これらの規則は、サービス・ルーチンをコーディングするためのサービス・テンプレートとも呼ばれます。次に、これらの規則についてまとめます。
TPRETURN
またはTPFORWAR
ルーチンのいずれかを呼び出す必要があります。 TPACALL
を使用して別のサーバーと通信する場合は、サービスの開始元は未処理の応答がすべて処理されるまで待機するか、またはTPCANCEL
を使用して未処理の応答をすべて無効にしてから、TPRETURN
またはTPFORWAR
を呼び出す必要があります。
サービス・ルーチンをコーディングする場合、最初にTPSVCSTART(3cbl)ルーチンを呼び出す必要があります。このルーチンは、サービスのパラメータとデータを取得します。TPSVCSTART
ルーチンの呼出しには、次のシグネチャを使用します。
01 TPSVCDEF-REC.
COPY TPSVCDEF.
01 TPTYPE-REC.
COPY TPTYPE.
01 DATA-REC.
COPY User Data.
01 TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPSVCSTART" USING TPSVCDEF-REC TPTYPE-REC DATA-REC TPSTATUS-REC.
サービス情報のデータ構造体は、COBOLのCOPY
ファイルにTPSVCDEF
として定義されます。このデータ構造体のメンバーは、次のとおりです。
05 COMM-HANDLE PIC S9(9) COMP-5.
05 TPBLOCK-FLAG PIC S9(9) COMP-5.
88 TPBLOCK VALUE 0.
88 TPNOBLOCK VALUE 1.
05 TPTRAN-FLAG PIC S9(9) COMP-5.
88 TPTRAN VALUE 0.
88 TPNOTRAN VALUE 1.
05 TPREPLY-FLAG PIC S9(9) COMP-5.
88 TPREPLY VALUE 0.
88 TPNOREPLY VALUE 1.
05 TPACK-FLAG PIC S9(9) COMP-5 REDEFINES TPREPLY-FLAG.
88 TPNOACK VALUE 0.
88 TPACK VALUE 1.
05 TPTIME-FLAG PIC S9(9) COMP-5.
88 TPTIME VALUE 0.
88 TPNOTIME VALUE 1.
05 TPSIGRSTRT-FLAG PIC S9(9) COMP-5.
88 TPNOSIGRSTRT VALUE 0.
88 TPSIGRSTRT VALUE 1.
05 TPGETANY-FLAG PIC S9(9) COMP-5.
88 TPGETHANDLE VALUE 0.
88 TPGETANY VALUE 1.
05 TPSENDRECV-FLAG PIC S9(9) COMP-5.
88 TPSENDONLY VALUE 0.
88 TPRECVONLY VALUE 1.
05 TPNOCHANGE-FLAG PIC S9(9) COMP-5.
88 TPCHANGE VALUE 0.
88 TPNOCHANGE VALUE 1.
05 TPSERVICETYPE-FLAG PIC S9(9) COMP-5.
88 TPREQRSP VALUE 0.
88 TPCONV VALUE 1.
*
05 APPKEY PIC S9(9) COMP-5.
05 CLIENTID OCCURS 4 TIMES PIC S9(9) COMP-5.
05 SERVICE-NAME PIC X(127).
次の表は、TPSVCDEF
データ構造体のメンバーを示しています。
TPTYPE-REC
データ構造体については、「型付きレコードの定義」を参照してください。
DATA-REC
に格納されるリクエスト・データにサービスがアクセスする場合は、構成ファイルでそのサービスに定義されているレコード・タイプにデータが格納されるようにコーディングする必要があります。制御が正常に戻った場合、DATA-REC
には受け取ったデータが格納され、LEN
には移動した実際のバイト数が格納されます。
次のサンプル・コードは、一般的なサービス定義を示しています。
IDENTIFICATION DIVISION.
PROGRAM-ID. BUYSR.
AUTHOR. TUXEDO DEVELOPMENT.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. USL-486.
OBJECT-COMPUTER. USL-486.
*
INPUT-OUTPUT SECTION.
. . .
******************************************************
* Tuxedo definitions
******************************************************
01 TPSVCRET-REC.
COPY TPSVCRET.
*
01 TPTYPE-REC.
COPY TPTYPE.
*
01 TPSTATUS-REC.
COPY TPSTATUS.
*
01 TPSVCDEF-REC.
COPY TPSVCDEF.
******************************************************
* Log message definitions
******************************************************
01 LOGMSG.
05 LOGMSG-TEXT PIC X(50).
*
01 LOGMSG-LEN PIC S9(9) COMP-5.
******************************************************
* User defined data records
******************************************************
01 CUST-REC.
COPY CUST.
*
LINKAGE SECTION.
*
PROCEDURE DIVISION.
*
START-BUYSR.
MOVE LENGTH OF LOGMSG TO LOGMSG-LEN.
OPEN files or DATABASE
******************************************************
* Get the data that was sent by the client
******************************************************
MOVE "Server Started" TO LOGMSG-TEXT.
PERFORM DO-USERLOG.
MOVE LENGTH OF CUST-REC TO LEN IN TPTYPE-REC.
CALL "TPSVCSTART" USING TPSVCDEF-REC
TPTYPE-REC
CUST-REC
TPSTATUS-REC.
IF TPTRUNCATE
MOVE "Input data exceeded CUST-REC length" TO LOGMSG-TEXT
PERFORM DO-USERLOG
PERFORM A-999-EXIT.
IF NOT TPOK
MOVE "TPSVCSTART Failed" TO LOGMSG-TEXT
PERFORM DO-USERLOG
PERFORM A-999-EXIT.
IF REC-TYPE NOT = "VIEW"
MOVE "REC-TYPE in not VIEW" TO LOGMSG-TEXT
PERFORM DO-USERLOG
PERFORM A-999-EXIT.
IF SUB-TYPE NOT = "cust"
MOVE "SUB-TYPE in not cust" TO LOGMSG-TEXT
PERFORM DO-USERLOG
PERFORM A-999-EXIT.
. . .
set consistency level of the transaction
. . .
******************************************************
* Exit
******************************************************
A-999-EXIT.
MOVE "Exiting" TO LOGMSG-TEXT.
PERFORM DO-USERLOG.
SET TPFAIL TO TRUE.
COPY TPRETURN REPLACING TPSVCRET-REC BY TPSVCRET-REC
TPTYPE-REC BY TPTYPE-REC
DATA-REC BY CUST-REC
TPSTATUS-REC BY TPSTATUS-REC.
******************************************************
* Write to userlog
******************************************************
DO-USERLOG.
CALL "USERLOG" USING LOGMSG
LOGMSG-LEN
TPSTATUS-REC.
この例では、クライアント側のリクエスト・レコードが最初に送られたときに、REC-TYPE
にVIEW
、SUB-TYPE
にcust
が設定されています。BUYSR
サービスは、VIEW
型レコードを認識するサービスとして構成ファイルに定義されています。BUYSR
サービスは、CUST-REC
レコードにアクセスしてデータ・レコードを取得します。このレコードが取得された後、データベースへの最初のアクセスを行う前に、トランザクションの整合性レベルが指定されています。トランザクションの整合性レベルの詳細は、『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の「グローバル・トランザクションのコーディング」を参照してください。
注: | 優先度を取得するTPGPRIO 、および優先度を設定するTPSPRIO ルーチンの詳細は、『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の「メッセージの優先度の設定および取得」を参照してください。 |
ここで示すサンプル・コードは、PRINTER
サービスがTPGPRIO
ルーチンを使用して、受信したばかりのリクエストの優先度を確認する方法を示しています。その優先度に基づいて、印刷ジョブが適切なプリンタRNAME
に送られます。
その後、INPUT-REC
の内容がプリンタに送られます。アプリケーションはTPSVCDEF-REC
に対して問合せを実行し、応答が必要かどうかを判定します。その場合は、宛先プリンタ名をクライアントに返します。TPRETURN
ルーチンの詳細は、「サービス・ルーチンの終了」を参照してください。
IDENTIFICATION DIVISION.
PROGRAM-ID. PRINTSR.
AUTHOR. TUXEDO DEVELOPMENT.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. USL-486.
OBJECT-COMPUTER. USL-486.
*
INPUT-OUTPUT SECTION.
. . .
******************************************************
* Tuxedo definitions
******************************************************
01 TPSVCRET-REC.
COPY TPSVCRET.
*
01 TPTYPE-REC.
COPY TPTYPE.
*
01 TPSTATUS-REC.
COPY TPSTATUS.
*
01 TPSVCDEF-REC.
COPY TPSVCDEF.
*
01 TPPRIDEF-REC.
COPY TPPRIDEF.
******************************************************
* Log message definitions
******************************************************
01 LOGMSG.
05 FILLER PIC S9(9) VALUE
"TP-STATUS=".
05 LOG-TP-STATUS PIC S9(9).
05 LOGMSG-TEXT PIC X(50).
*
01 LOGMSG-LEN PIC S9(9) COMP-5.
******************************************************
* User defined data records
******************************************************
01 INPUT-REC PIC X(1000).
01 PRNAME PIC X(20).
*
LINKAGE SECTION.
*
PROCEDURE DIVISION.
*
START-PRINTSR.
MOVE LENGTH OF LOGMSG TO LOGMSG-LEN.
OPEN files or DATABASE
******************************************************
* Get the data that was sent by the client
******************************************************
MOVE ZERO to TP-STATUS.
MOVE "Server Started" TO LOGMSG-TEXT.
PERFORM DO-USERLOG.
MOVE LENGTH OF INPUT-REC TO LEN.
CALL "TPSVCSTART" USING TPSVCDEF-REC
TPTYPE-REC
INPUT-REC
TPSTATUS-REC.
IF NOT TPOK
MOVE "TPSVCSTART Failed" TO LOGMSG-TEXT
PERFORM DO-USERLOG
SET TPFAIL TO TRUE.
PERFORM A-999-EXIT.
. . .
Check other parameters
CALL "TPGPRIO" USING TPPRIDEF-REC
TPSTATUS-REC.
IF NOT TPOK
MOVE "TPGPRIO Failed" TO LOGMSG-TEXT
PERFORM DO-USERLOG
SET TPFAIL TO TRUE.
PERFORM A-999-EXIT.
IF PRIORITY < 20
MOVE "BIGJOBS" TO RNAME
ELSE IF PRIORITY < 60
MOVE "MEDJOBS" TO RNAME
ELSE
MOVE "HIGHSPEED" TO RNAME.
. . .
Print INPUT-REC on RNAME printer
. . .
IF TPNOREPLY
MOVE SPACES TO REC-TYPE
MOVE 0 TO LEN
SET TPSUCCESS TO TRUE
PERFORM A-999-EXIT
IF TPREPLY
MOVE "STRING" TO REC-TYPE
MOVE LENGTH OF PRNAME TO LEN
SET TPSUCCESS TO TRUE
PERFORM A-999-EXIT.
******************************************************
* Exit
******************************************************
A-999-EXIT.
MOVE "Exiting" TO LOGMSG-TEXT.
PERFORM DO-USERLOG.
SET TPSUCCESS TO TRUE.
COPY TPRETURN REPLACING TPSVCRET-REC BY TPSVCRET-REC
TPTYPE-REC buTPTYPE-REC
DATA-REC BY PRNAME
TPSTATUS-REC BY TPSTATUS-REC.
******************************************************
* Write to userlog
******************************************************
DO-USERLOG.
MOVE TP-STATUS TO LOG-TP-STATUS.
CALL "USERLOG" USING LOGMSG
LOGMSG-LEN
TPSTATUS-REC.
TPRETURN(3cbl)、TPCANCEL(3cbl)、およびTPFORWAR(3cbl)ルーチンは、サービス・ルーチンが完了したことをそれぞれ次の方法で通知します。
TPRETURN(3cbl)呼出しは、サービス・ルーチンの終了を示すEXIT
文を含んだCOBOLのcopyファイルで、TPFORWAR(3cbl)呼出しは、メッセージをリクエスタに送信したり、リクエストを別のサービスに転送するCOBOLのcopyファイルです。TPRETURN
ルーチンの呼出しには、次のシグネチャを使用します。
01 TPSVCRET-REC.
COPY TPSVCRET.
01 TPTYPE-REC.
COPY TPTYPE.
01 DATA-REC.
COPY User Data.
01 TPSTATUS-REC.
COPY TPSTATUS.
COPY TPRETURN REPLACING TPSVCRET-REC BY TPSVCRET-REC
TPTYPE-REC BY TPTYPE-REC
DATA-REC BY DATA-REC
TPSTATUS-REC BY TPSTATUS-REC.
注: | ここでは、CALL ではなくCOPY を使用する必要があります。これにより、EXIT 文が正しく呼び出され、COBOLサービス・ルーチンがOracle Tuxedoシステムに制御を戻します。 |
次のコードは、TPSVCRET-REC
レコードのシグネチャを示しています。
05 TPRETURN-VAL PIC S9(9) COMP-5.
88 TPSUCCESS VALUE 0.
88 TPFAIL VALUE 1.
88 TPFAIL VALUE 2.
05 APPL-CODE PIC S9(9) COMP-5.
表5-2は、TPSVCRET-REC
データ構造体のメンバーを示しています。
この引数の値がグローバル・トランザクションに与える影響の詳細は、『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の「グローバル・トランザクションのコーディング」を参照してください。
|
|
TPTYPE-REC
レコードについては、「サービスの定義」を参照してください。
サービス・ルーチンの主なタスクは、リクエストを処理してクライアント・プロセスに応答を返すことです。ただし、要求されたタスクを行うために必要なすべての処理を1つのサービスで行う必要はありません。サービスはリクエスタとして動作し、クライアントが元のリクエストを行ったときと同じように、TPCALL
またはTPACALL
を呼び出して、リクエスト呼出しを別のサービスに渡すことができます。
注: | TPCALL およびTPACALL ルーチンの詳細は、『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の「クライアントおよびサーバーへのリクエスト/レスポンスのコーディング」を参照してください。 |
TPRETURN
が呼び出された場合、常に制御プログラムに制御が戻ります。非同期応答でサービスがリクエストを送信している場合、制御プログラムに制御を戻す前にすべての応答を受信するか、またはTPCANCEL
を使用してすでに送信したリクエストを無効にする必要があります。それ以外の場合、未処理の応答はOracle Tuxedoシステムの制御プログラムで受信されると自動的に破棄され、呼出し側にエラーが返されます。
クライアントがTPCALL
を使用してサービスを呼び出した場合、TPRETURN
の呼出しが成功すると、O-DATA-REC
レコードから応答メッセージを取得できます。TPACALL
を使用してリクエストを送信し、TPRETURN
から正常に制御が戻されると、TPGETRPLY
のDATA-REC
レコードに応答メッセージが格納されます。
応答が必要な場合に、TPRETURN
の引数の処理時にエラーが発生すると、呼出し側プロセスに失敗を示すメッセージが送信されます。呼出し側は、
TP-STATUS
に格納されている値を調べてエラーを検出します。失敗を示すメッセージが送信された場合、TP-STATUS
にTPESVCERR
が設定されます。この値は、APPL-RETURN-CODE IN TPSTATUS-REC
の値よりも優先されます。このようなエラーが発生した場合、応答データは戻されず、呼出し側の出力レコードの内容と長さは変更されません。
TPRETURN
が不明なタイプのレコードにメッセージを返すか、または呼出し側で使用できないレコードにメッセージを返した場合、つまりTPNOCHANGE
が設定されて呼出しが行われた場合、TP-STATUS
にTPEOTYPE
が返されます。その場合、アプリケーションの成功また失敗は判定されず、呼出し側の出力レコードの内容と長さは変更されません。
TPRETURN
ルーチンが呼び出され、呼出し側が応答を待っている間にタイムアウトが発生した場合、APPL-RETURN-CODE IN TPSTATUS-REC
に戻される値は意味を持ちません。この状況は、TP-STATUS
に値が戻されるどの状況よりも優先します。その場合、TP-STATUS
にTPETIME
が設定され、応答データは送信されず、呼出し側の応答レコードの内容と長さは変更されません。Oracle Tuxedoシステムには、ブロッキング・タイムアウトとトランザクション・タイムアウトの2種類のタイムアウトがあります(詳細は、『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の「グローバル・トランザクションのコーディング」を参照)。
ここで示すサンプル・コードは、XFER
サーバーの一部であるTRANSFER
サービスを示しています。基本的に、TRANSFER
サービスはWITHDRAWAL
およびDEPOSIT
サービスへの同期呼出しを行います。このサービスでは、WITHDRAWAL
とDEPOSIT
の両サービスの呼出しに同じリクエスト・レコードを使用する必要があるので、応答メッセージ用に別のレコードが割り当てられます。WITHDRAWAL
の呼出しが失敗した場合、フォーム上のステータス行に「cannot withdraw」
というメッセージが出力され、TPRETURN
ルーチンのTP-RETURN-VAL IN TPSVCRET-REC
にTPFAIL
が設定されます。呼出しが成功した場合、振替元口座の残高が応答レコードから取得されます。
注: | 次のサンプル・コードでは、フィールド化レコードtransf 内のACCOUNT_ID フィールドのゼロ番目のオカレンスに、アプリケーションがcr_id 変数から取得した振替先口座の識別子を移動しています。このような移動が必要なのは、FML レコード内のフィールドのこのオカレンスが、データ依存型ルーティングに使用されるからです。詳細は、『Oracle Tuxedoアプリケーションの設定』を参照してください。 |
DEPOSIT
サービスへの呼出しは、同様のシナリオに従います。呼出しが成功すると、このサービスによってTP-RETURN-VAL IN TPSVCRET-REC
にTPSUCCESS
が設定されて、適切な残高情報がステータス行に返されます。
IDENTIFICATION DIVISION.
PROGRAM-ID. TRANSFER.
AUTHOR. TUXEDO DEVELOPMENT.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. USL-486.
OBJECT-COMPUTER. USL-486.
*
INPUT-OUTPUT SECTION.
. . .
******************************************************
* Tuxedo definitions
******************************************************
01 TPSVCRET-REC.
COPY TPSVCRET.
*
01 TPTYPE-REC.
COPY TPTYPE.
*
01 TPSTATUS-REC.
COPY TPSTATUS.
*
01 TPSVCDEF-REC.
COPY TPSVCDEF.
******************************************************
* User defined data records
******************************************************
01 TRANS-REC.
COPY TRANS-AMOUNT.
*
LINKAGE SECTION.
*
PROCEDURE DIVISION.
*
START-TRANSFER.
******************************************************
* Get the data that was sent by the client
******************************************************
MOVE LENGTH OF TRANS-REC TO LEN.
CALL "TPSVCSTART" USING TPSVCDEF-REC
TPTYPE-REC
TRANS-REC
TPSTATUS-REC.
IF NOT TPOK
MOVE "Transaction Encountered An Error" TO STATUS-LINE
SET TPFAIL TO TRUE.
COPY TPRETURN REPLACING TPSVCRET-REC BY TPSVCRET-REC
TPTYPE-REC BY TPTYPE-REC
DATA-REC BY TRANS-REC
TPSTATUS-REC BY TPSTATUS-REC.
ELSE
. . . Check other parameters
******************************************************
* must have a valid debit and credit account number
******************************************************
CALL "FIND-ACCOUNT-FUNCTION" USING TRANS-DEBIT-ACCOUNT IN TRANS-REC.
IF TRANS-DEBIT-ACCOUNT is not valid
MOVE "Invalid Debit Account Number"
TO STATUS-LINE IN TRANS-REC
SET TPFAIL TO TRUE
COPY TPRETURN REPLACING
DATA-REC BY TRANS-REC.
CALL "FIND-ACCOUNT-FUNCTION" USING TRANS-CREDIT-ACCOUNT IN TRANS-REC.
IF TRANS-CREDIT-ACCOUNT is not valid
MOVE "Invalid Credit Account Number"
TO STATUS-LINE IN TRANS-REC
SET TPFAIL TO TRUE
COPY TPRETURN REPLACING
DATA-REC BY TRANS-REC.
******************************************************
* Check amount to transfer
******************************************************
IF TRANS-AMOUNT IN TRANS-REC < 0
MOVE "Invalid Transfer Amount Requested"
TO STATUS-LINE IN TRANS-REC
SET TPFAIL TO TRUE
COPY TPRETURN REPLACING
DATA-REC BY TRANS-REC.
******************************************************
* Make Withdrawal using another service
******************************************************
MOVE "WITHDRAWAL" TO SERVICE-NAME.
. . . set other TPCALL parameters
CALL "TPCALL" USING . . .
IF NOT TPOK
MOVE "Cannot withdraw from debit account"
TO STATUS-LINE IN TRANS-REC
SET TPFAIL TO TRUE
COPY TPRETURN REPLACING
DATA-REC BY TRANS-REC.
******************************************************
* Make Deposit using another service
******************************************************
MOVE "DEPOSIT" TO SERVICE-NAME.
. . . set other TPCALL parameters
CALL "TPCALL" USING . . .
IF NOT TPOK
MOVE "Cannot Deposit into credit account"
TO STATUS-LINE IN TRANS-REC
SET TPFAIL TO TRUE
COPY TPRETURN REPLACING
DATA-REC BY TRANS-REC.
. . .
MOVE "Transfer completed" TO STATUS-LINE IN TRANS-REC
. . . MOVE all the data into TRANS-REC needed by the client
SET TPSUCCESS TO TRUE
COPY TPRETURN REPLACING
DATA-REC BY TRANS-REC.
TPGETRPLY
を呼び出したサービス(『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の「クライアントおよびサーバーへのリクエスト/レスポンスのコーディング」を参照)がTPETIME
で失敗してリクエストを取り消す場合、TPCANCEL(3cbl)を呼び出して記述子を無効にできます。以降、応答が届いても自動的に破棄されます。
TPCANCEL
はトランザクション応答、つまりTPNOTRAN
フラグが設定されていない状態で呼び出されたリクエストへの応答には使用できません。トランザクション内では、TPABORT(3cbl)がトランザクションの呼出し記述子を無効にします。
リスト5-7は、タイムアウト後の応答を無効にする方法を示しています。
. . . Set up parameters to TPACALL
SET TPNOTRAN TO TRUE.
CALL "TPACALL" USING TPSVCDEF-REC
TPTYPE-REC
DEBIT-REC
TPSTATUS-REC.
IF NOT TPOK
error processing
. . .
CALL "TPGETRPLY" USING TPSVCDEF-REC
TPTYPE-REC
DEBIT-REC
TPSTATUS-REC.
IF NOT TPOK
error processing
IF TPETIME
CALL "TPCANCEL" TPSVCDEF-REC
TPSTATUS-REC.
. . .
SET TPSUCCESS TO TRUE.
COPY TPRETURN REPLACING TPSVCRET-REC BY TPSVCRET-REC
TPTYPE-REC BY TPTYPE-REC
DATA-REC BY DEBIT-REC
TPSTATUS-REC BY TPSTATUS-REC.
TPFORWAR(3cbl)ルーチンを使用すると、サービス・リクエストを他のサービスに転送して、別の処理を行うことができます。
TPFORWAR
ルーチンの呼出しには、次のシグネチャを使用します。
01 TPSVCDEF-REC.
COPY TPSVCDEF.
01 TPTYPE-REC.
COPY TPTYPE.
01 DATA-REC.
COPY User Data.
01 TPSTATUS-REC.
COPY TPSTATUS.
COPY TPFORWAR REPLACING TPSVCDEF-REC BY TPSVCDEF-REC
TPTYPE-REC BY TPTYPE-REC
DATA-REC BY DATA-REC
TPSTATUS-REC BY TPSTATUS-REC.
TPSVCDEF-REC
およびTPTYPE-REC
レコードについては、「サービスの定義」を参照してください。
TPFORWAR
は、サービス呼出しとは異なります。つまり、リクエストの転送元サービスでは、応答はリクエストされていません。応答を返すのは、リクエストの転送先サービスです。 このサービスを転送されたサービスが、リクエストの発信元プロセスに応答を返します。後者のサービスが、リクエストの発信元プロセスに応答を送信します。転送が連鎖的に行われる場合、最後のサーバーがTPRETURN
を呼び出して、リクエストの発信元であるクライアントに応答を返します。
図5-1は、あるサービスから別のサービスにリクエストを転送したときのイベントの流れを示しています。ここでは、クライアントはTPCALL
ルーチンを使用してリクエストを開始し、連鎖の最後のサービス(SVC_C
)がTPRETURN
ルーチンを使用して応答を戻しています。
サービス・ルーチンはTPSPRIO
ルーチンを使用して、クライアント・プロセスがリクエストを送るのと同じように、指定された優先度に従ってリクエストを転送できます。
プロセスがTPFORWAR
を呼び出すと、システムで提供された制御プログラムに制御が戻り、サーバー・プロセスは別のリクエストを処理できるようになります。
注: | クライアントとして動作するサーバー・プロセスが応答をリクエストする場合、このサーバーが自分自身からサービスをリクエストすることはできません。つまり、必要なサービスの唯一のインスタンスがリクエストを行っているサーバー・プロセスからのみ提供される場合、その呼出しは失敗して再帰呼出しができないことが示されます。ただし、TPNOREPLY 通信フラグが設定された状態でサービス・ルーチンが自分宛てにリクエストを送信または転送した場合、サービスは自分からの応答を待機しないので、呼出しは失敗しません。 |
TPFORWAR
呼出しを使用して、その呼出しを行った時点まで要求の処理が成功していたことを示すことができます。アプリケーション・エラーが検出されなかった場合、TPFORWAR
を呼び出します。エラーが検出された場合、TP-RETURN-VAL IN TPSVCRET-REC
にTPFAIL
を設定してTPRETURN
を呼び出します。
次のサンプル・コードは、TPFORWAR
を呼び出して、サービスがそのデータ・レコードをDEPOSIT
サービスに送る方法を示しています。新規口座の追加が成功した場合、支店レコードが更新されてその口座が反映され、データ・レコードがDEPOSIT
サービスに転送されます。失敗した場合、TP-RETURN-VAL IN TPSVCRET-REC
にTPFAIL
が設定されてTPRETURN
が呼び出され、失敗を示すメッセージがフォーム上のステータス行に出力されます。
. . .
******************************************************
* Get the data that was sent by the client
******************************************************
MOVE LENGTH OF TRANS-REC TO LEN.
CALL "TPSVCSTART" USING TPSVCDEF-REC
TPTYPE-REC
TRANS-REC
TPSTATUS-REC.
IF NOT TPOK
MOVE "Transaction Encountered An Error" TO STATUS-LINE
SET TPFAIL TO TRUE.
COPY TPRETURN REPLACING
DATA-REC BY TRANS-REC.
ELSE
. . . Check other parameters
******************************************************
* Insert new account record
******************************************************
CALL "ADD-NEW-ACCOUNT-FUNCTION" USING TRANS-ACCOUNT IN TRANS-REC.
IF Adding New Account Failed
MOVE "Account not added" TO STATUS-LINE IN TRANS-REC
SET TPFAIL TO TRUE
COPY TPRETURN REPLACING
DATA-REC BY TRANS-REC.
******************************************************
* Forward record to the DEPOSIT service to add initial
* balance into account
******************************************************
MOVE "DEPOSIT" TO SERVICE-NAME.
. . . set other TPFORWAR parameters
COPY TPFORWAR REPLACING
DATA-REC BY TRANS-REC.
サーバーは起動時に、構成ファイルのCLOPT
パラメータに指定された値に基づいて、提供するサービスを通知します。
注: | サーバーが通知するサービスは、buildserverコマンドの実行時に最初に定義されます。-s オプションを使用すると、複数のサービスをカンマ区切りで指定できます。また、通知されたサービスと異なる名前のルーチンを呼び出して、サービス・リクエストを処理できます。詳細は、『Oracle Tuxedoコマンド・リファレンス』の「buildserver(1)」を参照してください。 |
デフォルトでは、サーバーに組み込まれたすべてのサービスをそのサーバーが通知します。詳細は、『ファイル形式、データ記述、MIBおよびシステム・プロセス・リファレンス』の「UBBCONFIG(5)」または「servopts(5)」リファレンス・ページを参照してください。
通知されたサービスでは掲示板のサービス表エントリが使用されるので、リソースが消費される場合があります。そのため、サーバーの起動時には、提供されるサービスのサブセットだけを利用できるようにします。アプリケーションで利用できるサービスを制限するには、構成ファイルのSERVERS
セクションで該当するエントリにCLOPT
パラメータを定義し、-s
オプションの後に必要なサービスをカンマで区切って指定します。また、-s
オプションを使用すると、サービス要求を処理するために呼び出される通知済のサービスと異なる名前のルーチンを呼び出すこともできます。詳細は、『ファイル形式、データ記述、MIBおよびシステム・プロセス・リファレンス』の「servopts(5)」リファレンス・ページを参照してください。
Oracle Tuxedoアプリケーションの管理者は、tmadmin(1)のadvertise
およびunadvertise
コマンドを使用して、サーバーで提供されるサービスを管理できます。TPADVERTISE
およびTPUNADVERTISE
ルーチンを使用すると、リクエスト/レスポンス型サーバーまたは会話型サーバーでのサービスの通知を動的に制御できます。ただし、通知されるサービス、または通知を解除するサービスは、リクエストを行うサービスと同じサーバー内になければなりません。
TPADVERTISE(3cbl)関数の呼出しには、次のシグネチャを使用します。
01 SERVICE-NAME PIC X(127).
01 PROGRAM-NAME PIC X(32).
01 TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPADVERTISE" USING SERVICE-NAME PROGRAM-NAME TPSTATUS-REC.
表5-3は、TPADVERTISE
データ構造体のメンバーを示しています。
TPUNADVERTISE(3cbl)ルーチンは、掲示板のサービス表からサービス名を削除します。サービス名が削除されたサービスは、通知されていない状態になります。
TPUNADVERTISE
ルーチンの呼出しには、次のシグネチャを使用します。
01 SERVICE-NAME PIC X(127).
01 TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPUNADVERTISE" USING SERVICE-NAME TPSTATUS-REC.
TPUNADVERTISE
データ構造体のメンバーは、表5-4で説明するメンバーだけです。
次のサンプル・コードは、TPADVERTISE
ルーチンの使用方法を示しています。このコードでは、サーバーTLR
が起動時にTLRINIT
サービスだけを提供するようにコーディングされています。初期化後、TLRINIT
はDEPOSIT
とWITHDRAW
という2つのサービスを通知します。両サービスともTLRFUNCS
ルーチンによって実行され、サーバーTLR
に組み込まれています。
DEPOSIT
とWITHDRAW
を通知した後、TLRINIT
は自分自身で通知を解除します。
. . .
**************************************************
* Advertise DEPOSIT service to be processed by
* routine TLRFUNCS
**************************************************
MOVE "DEPOSIT" TO SERVICE-NAME.
MOVE "TLRFUNCS" TO PROGRAM-NAME.
CALL "TPADVERTISE" USING SERVICE-NAME
PROGRAM-REC
TPSTATUS-REC.
IF NOT TPOK
error processing
**************************************************
* Advertise WITHDRAW service to be processed by
* the same routine TLRFUNCS
**************************************************
MOVE "WITHDRAW" TO SERVICE-NAME.
MOVE "TLRFUNCS" TO PROGRAM-NAME.
CALL "TPADVERTISE" USING SERVICE-NAME
PROGRAM-REC
TPSTATUS-REC.
IF NOT TPOK
error processing
**************************************************
* Unadvertise TLRINIT service (yourself)
**************************************************
MOVE "TLRINIT" TO SERVICE-NAME.
CALL "TPUNADVERTISE" USING SERVICE-NAME
TPSTATUS-REC.
IF NOT TPOK
error processing
実行可能なATMIサーバーをビルドするには、buildserver(1)コマンドに-C
オプションを使用して、Oracle Tuxedoシステム・サーバー・アダプタなどすべての参照ファイルでアプリケーション・サービス・サブルーチンをコンパイルします。
注: | Oracle Tuxedoサーバー・アダプタは、メッセージの受信、処理のディスパッチ、トランザクションが有効な場合はトランザクションの管理を行います。 |
buildserver -C -ofilename
-ffilenames
-lfilenames
-s -v
表5-5は、buildserver
コマンド行オプションを示しています。
実行可能サーバーにリンクされるリソース・マネージャのアクセス・ライブラリのリスト。アプリケーション管理者は、buildtms(1)コマンドを使用して、すべての有効なリソース・マネージャ情報を
$TUXDIR/updataobj/RM ファイルに事前に定義しておく必要があります。リソース・マネージャは1つしか指定できません。詳細は、『Oracle Tuxedoアプリケーションの設定』を参照してください。
|
|
注: | Oracle Tuxedoライブラリは自動的にリンクされます。コマンド行にOracle Tuxedoライブラリ名を指定する必要はありません。 |
注: | リンクの編集はbuildclient コマンドを実行して行う必要があります。 |
リンクするライブラリ・ファイルの指定順序は重要です。ルーチンを呼び出す順序と、これらのルーチンへの参照を含むライブラリによって、この順序が決定されます。
デフォルトでは、buildserver
コマンドはUNIXのcobcc
コマンドを呼び出し、MicroFocus Net Expressコンパイラが使用されます。Fujitsu NetCOBOLを使用するには、WindowsシステムでもALTCC
を設定する必要があります。NetCOBOL用にALTCC=cobcc85
を設定する必要があります。環境変数ALTCC
を設定して別のコンパイル・コマンドを指定したり、ALTCFLAGS
を設定してコンパイル・フェーズやリンク・フェーズに独自のフラグを指定することができます。詳細は、『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の「環境変数の設定」を参照してください。
注: | 1. Windowsシステムでは、環境変数ALTCC およびALTCFLAGS は使用できません。これらを設定すると、予期しない結果が生じます。最初にCOBOLコンパイラを使用してアプリケーションをコンパイルし、次に生成されたオブジェクト・ファイルをbuildserver コマンドに渡します。 |
注: | 2. ALTCFLAGS は、MicroFocus COBOLコンパイラでのみ機能します。他のサポートされているCOBOLコンパイラ(つまり、IBMCOBOLまたはAccuCOBOL)では、CFLAGS で十分に対応できます。 |
次のコマンドは、acct.o
アプリケーション・ファイルを処理して、NEW_ACCTとCLOSE_ACCTという2つのサービスを含むACCT
サーバーを作成しています。NEW_ACCT
はOPEN_ACCT
ルーチンを呼び出し、CLOSE_ACCT
は同じ名前のルーチンを呼び出します。
buildserver -C – o ACCT – f acct.o – s NEW_ACCT:OPEN_ACCT – s CLOSE_ACCT