クライアントおよびサーバーへのリクエスト/レスポンスのコーディング
リクエスト/レスポンス通信モードでは、あるソフトウェア・モジュールが別のソフトウェア・モジュールにリクエストを送り、レスポンスを待ちます。最初のソフトウェア・モジュールがクライアント、2番目のソフトウェア・モジュールがサーバーとして動作するため、このモードはクライアント/サーバー相互作用とも呼ばれます。オンラインの銀行業務の多くは、リクエスト/レスポンス・モードでプログラミングされます。たとえば、残高照会のリクエストは、次のように行われます。
1.
|
顧客(クライアント)は、口座レコード管理システム(サーバー)に、残高照会のリクエストを送信します。
|
2.
|
口座レコード管理システム(サーバー)は、指定された口座の残高を応答として顧客(クライアント)に送ります。
|
クライアント・プロセスはアプリケーションに参加すると、リクエスト・メッセージをサブルーチンに送信して処理を行い、応答メッセージを受信できるようになります。
TPCALL(3cbl)呼出しは、サービス・サブルーチンにリクエストを送信し、同期的に応答を待ちます。
TPCALLルーチンの呼出しには、次のシグネチャを使用します。
01
TPSVCDEF-REC.
COPY TPSVCDEF.
01
ITPTYPE-REC.
COPY TPTYPE.
01
IDATA-REC.
COPY User Data.
01
OTPYTPE-REC.
COPY TPTYPE.
01
ODATA-REC.
COPY User Data.
01
TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPCALL" USING
TPSVCDEF-REC
ITPTYPE-REC
IDATA-REC
OTPTYPE-REC
ODATA-REC
TPSTATUS-REC.
TPSVCDEFデータ構造体の詳細は、
『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』を参照してください。
IDATA-RECおよび
ITPTYPE-REC構造体は、リクエスト・レコードを定義します。
ODATA-RECおよび
OTPTYPE-REC構造体は、応答レコードを定義します。
ITPTYPE-RECおよび
OTPTYPE-RECデータ構造体は、
TPTYPE-RECデータ構造体と似ています。
TPCALLは整数を返します。失敗した場合、発生したエラー条件を示す値が
TP-STATUSに設定されます。有効なエラー・コードの詳細は、
『Oracle Tuxedo ATMI COBOL関数リファレンス』の
「TPCALL(3cbl)」を参照してください。
注意:
|
通信呼出しは様々な原因で失敗しますが、そのほとんどは、アプリケーション・レベルで修正できます。失敗の原因としては、アプリケーション定義のエラー( TPESVCFAIL)、戻り値の引数の処理エラー( TPESVCERR)、型付きレコードのエラー( TPEITYPE、 TPEOTYPE)、タイムアウト・エラー( TPETIME)、プロトコル・エラー( TPEPROTO)などがあります。エラーの詳細は、 『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の 「エラーの管理」を参照してください。発生する可能性があるエラーのリストの詳細は、 『Oracle Tuxedo ATMI COBOL関数リファレンス』の 「TPCALL(3cbl)」を参照してください。
|
Oracle Tuxedoシステムでは、割り当てられているレコードより大きなメッセージを受信した場合、メッセージ受信用レコードのサイズが自動的に変更されます。そのため、応答レコードのサイズが変更されたかどうかを確認する必要があります。
レコードの新しいサイズにアクセスするには、*
LEN IN OTPTYPE-RECに返されたアドレスを使用します。応答レコードのサイズが変更されたかどうかを確認するには、
TPCALLを呼び出す前の応答レコードのサイズと、返された応答レコードの
LEN IN OTPTYPE-RECの値とを比較します。
LEN IN OTPTYPE-RECが元の値より大きい場合、レコードのサイズは大きくなっています。それ以外の場合、レコードのサイズは変更されていません。
例: リクエスト・メッセージと応答メッセージに同じレコードの使用
以下のサンプル・コードは、クライアント・プログラムで、リクエスト・メッセージと応答メッセージに同じレコードを使用して、同期呼出しを行う方法を示しています。この例では、
AUDV-RECメッセージ・レコードはリクエスト情報と応答情報の両方を格納するように設定されているので、同じレコードを使用することができます。このコードでは、次の処理が行われます。
1.
|
サービスは B_IDフィールドに対して問合せを実行します。ただし、このフィールドを上書きしません。
|
2.
|
アプリケーションは、 BALANCEフィールドをゼロに初期化して、サービスから返される値を受け取る準備をします。
|
3.
|
SERVICE-NAMEはリクエストされたサービス名を示します。この例では、口座残高 と窓口残高 が示されます。
|
リスト6-1
リクエスト・メッセージと応答メッセージに同じレコードの使用
WORKING-STORAGE SECTION.
*****************************************************
* Tuxedo definitions
*****************************************************
01 TPTYPE-REC.
COPY TPTYPE.
*
01 TPSTATUS-REC.
COPY TPSTATUS.
*
01 TPSVCDEF-REC.
COPY TPSVCDEF.
*****************************************************
* Log messages definitions
*****************************************************
01 LOGMSG.
05 FILLER PIC X(6) VALUE "FIG =>".
05 LOGMSG-TEXT PIC X(50).
01 LOGMSG-LEN PIC S9(9) COMP-5.
*
01 USER-DATA-REC PIC X(75).
*****************************************************
* This VIEW record (audv) will be sent to the server
*****************************************************
01 AUDV-REC.
COPY AUDV.
*
******************************************************
PROCEDURE DIVISION.
START-FIG.
MOVE LENGTH OF LOGMSG TO LOGMSG-LEN.
*****************************************************
* Prepare the audv record
*****************************************************
MOVE "BRANCH" TO B-ID IN AUDV-REC.
MOVE 0 TO BALANCE IN AUDV-REC.
MOVE LENGTH OF AUDV-REC TO LEN.
MOVE "VIEW" TO REC-TYPE.
MOVE "audv" TO SUB-TYPE.
MOVE "SOMESERVICE" TO SERVICE-NAME.
SET TPBLOCK TO TRUE.
SET TPNOTRAN TO TRUE.
SET TPNOTIME TO TRUE.
SET TPSIGRSTRT TO TRUE.
SET TPNOCHANGE TO TRUE.
CALL "TPCALL" USING TPSVCDEF-REC
TPTYPE-REC
AUDV-REC
TPTYPE-REC
AUDV-REC
TPSTATUS-REC.
IF NOT TPOK
MOVE "Service Failed" TO LOGMSG-TEXT
PERFORM DO-USERLOG
PERFORM EXIT-PROGRAM.
DISPLAY BRANCH and BALANCE
. . .
応答が
ODATA-RECより大きい場合、
ODATA-RECにはこのレコードに入るだけのメッセージが格納されます。残りのメッセージは破棄され、
TPCALLは
TP-STATUS IN TPSTATUS-RECに
TPTRUNCATEを設定します。
例: TPSIGRSTRTフラグを設定した同期メッセージの送信
以下のサンプル・コードは、
bankappの
XFERサーバー・プロセスの一部である
TRANSFERサービスに基づいています。 (
bankappは、Oracle Tuxedoシステムに提供されている銀行業務のサンプルATMIアプリケーションです。)この例では、あるサービスがクライアントとして
WITHDRAWALおよび
DEPOSITサービスを呼び出します。アプリケーションはこの2つのサービスを呼び出すときに通信フラグを
TPSIGRSTRTに設定して、トランザクションをコミットしやすいようにします。
TPSIGRSTRTフラグは、シグナルの割込みがあった場合に行う処理を指定します。通信フラグの詳細は、
『Oracle Tuxedo ATMI COBOL関数リファレンス』の
「TPCALL(3cbl)」を参照してください。
リスト6-2
TPSIGRSTRTフラグを設定した同期メッセージの送信
WORKING-STORAGE SECTION.
*****************************************************
* Tuxedo definitions
*****************************************************
01 TPTYPE-REC.
COPY TPTYPE.
*
01 TPSTATUS-REC.
COPY TPSTATUS.
*
01 TPSVCDEF-REC.
COPY TPSVCDEF.
*****************************************************
* This VIEW record (audv) will be sent to the server
*****************************************************
01 AUDV-REC.
COPY AUDV.
*
******************************************************
PROCEDURE DIVISION.
START-FIG.
*****************************************************
* Prepare the audv record for withdrawal
*****************************************************
. . .
MOVE "WITHDRAWAL" TO SERVICE-NAME.
SET TPSIGRSTRT TO TRUE.
PERFORM DO-TPCALL.
IF NOT TPOK
MOVE "Cannot withdraw from debit account" TO LOGMSG-TEXT
PERFORM DO-USERLOG
PERFORM EXIT-PROGRAM.
MOVE "DEPOSIT" TO SERVICE-NAME.
SET TPSIGRSTRT TO TRUE.
PERFORM DO-TPCALL.
IF NOT TPOK
MOVE "Cannot deposit into credit account" TO LOGMSG-TEXT
PERFORM DO-USERLOG
PERFORM EXIT-PROGRAM.
. . .
*****************************************************
* Perform a TPCALL
*****************************************************
DO-TPCALL.
MOVE LENGTH OF AUDV-REC TO LEN.
MOVE "VIEW" TO REC-TYPE.
MOVE "audv" TO SUB-TYPE.
SET TPBLOCK TO TRUE.
SET TPNOTRAN TO TRUE.
SET TPNOTIME TO TRUE.
SET TPNOCHANGE TO TRUE.
CALL "TPCALL" USING TPSVCDEF-REC
TPTYPE-REC
AUDV-REC
TPTYPE-REC
AUDV-REC
TPSTATUS-REC.
. . .
例: TPNOTRANフラグを設定した同期メッセージの送信
以下のサンプル・コードは、トランザクション・モードではない通信呼出しを示しています。この呼出しは、リソース・マネージャに関連していないサービスに対して実行され、サービスがトランザクションに参加するとエラーになります。アプリケーションは、データベース
ACCOUNTSから取得した情報に基づいて生成された売掛金勘定レポート
ACCRVを出力します。
サービス・ルーチン
REPORTは指定されたパラメータを解釈し、完了したレポートのバイト・ストリームを応答として送信します。クライアントは、
TPCALLを使用して
PRINTERサービスにバイト・ストリームを送信します。PRINTERは、クライアントに近いプリンタにバイト・ストリームを送信します。そして、応答が印刷されます。最後に、
PRINTERサービスはハードコピーの印刷が終了したことをクライアントに通知します。
リスト6-3
TPNOTRANフラグを設定した同期メッセージの送信
WORKING-STORAGE SECTION.
*****************************************************
* Tuxedo definitions
*****************************************************
01 ITPTYPE-REC.
COPY TPTYPE.
01 OTPTYPE-REC.
COPY TPTYPE.
*
01 TPSTATUS-REC.
COPY TPSTATUS.
*
01 TPSVCDEF-REC.
COPY TPSVCDEF.
*****************************************************
01 REPORT-REQUEST PIC X(100) VALUE SPACES.
01 REPORT-OUTPUT PIC X(50000) VALUE SPACES.
******************************************************
PROCEDURE DIVISION.
START-FIG.
. . .
join application
start transaction
. . .
********************************************************
* Send report request to REPORT service
* Receive results into REPORT-OUTPUT
********************************************************
MOVE "REPORT=accrcv DBNAME=accounts" TO REPORT-REQUEST.
MOVE "STRING" TO REC-TYPE IN ITYPE-REC.
MOVE 29 TO LEN IN ITYPE-REC.
MOVE "STRING" TO REC-TYPE IN OITYPE-REC.
MOVE 50000 TO LEN IN OTYPE-REC.
MOVE "REPORT" TO SERVICE-NAME.
SET TPTRAN TO TRUE.
SET TPBLOCK TO TRUE.
SET TPNOTIME TO TRUE.
SET TPSIGRSTRT TO TRUE.
SET TPNOCHANGE TO TRUE.
CALL "TPCALL" USING TPSVCDEF-REC
ITPTYPE-REC
REPORT-REQUEST
OTPTYPE-REC
REPORT-OUTPUT
TPSTATUS-REC.
IF NOT TPOK
error processing
IF TPETRUNCATE
The report was truncated
error processing
********************************************************
* Send REPORT-OUTPUT to PRINTER service
********************************************************
MOVE "PRINTER" TO SERVICE-NAME.
SET TPNOTRAN TO TRUE.
MOVE "STRING" TO REC-TYPE IN ITTYPE-REC.
MOVE LEN IN OTYPE-REC TO LEN IN ITYPE-REC.
CALL "TPCALL" USING TPSVCDEF-REC
ITPTYPE-REC
REPORT-OUTPUT
OTPTYPE-REC
REPORT-OUTPUT
TPSTATUS-REC.
IF NOT TPOK
error processing
. . .
terminate transaction
leave application
注意:
|
この例の error routineは、エラー・メッセージの出力、トランザクションの中止、クライアントのアプリケーションからの分離、およびプログラムの終了が行われることを示しています。
|
また、この例では、最初に割り当てられたレコード・タイプと同じタイプで応答メッセージを返す必要があることを示して、
TPNOCHANGE通信フラグを使用して厳密なタイプ・チェックを行う方法を示しています。厳密なタイプ・チェックのフラグ
TPNOCHANGEが設定されているので、
STRING型のレコードに応答が返されます。
厳密なタイプ・チェックを行うのは、
REPORTサービス・サブルーチンでエラーが発生して、不適切なタイプの応答レコードが使用されることを防ぐためです。もう1つの理由は、依存関係にあるすべてのエリアで一貫していない変更が行わることを防ぐためです。たとえば、あるプログラマが
REPORTサービスを変更してすべての応答を別の
STRING形式で標準化したが、それを反映するためにクライアント・プロセスを変更しなかった場合などがあります。
この項では、次の操作を行う方法について説明します。
•
|
TPACALLルーチンを使用した非同期リクエストの送信
|
•
|
TPGETRPLYルーチンを使用した非同期応答の取得
|
この項で説明する非同期の処理は、
ファンアウト並列処理と呼ばれます。クライアントのリクエストが複数のサービスに同時に分散(ファンアウト)されて処理が行われるからです。
この他に、Oracle Tuxedoシステムでは、非同期処理としてパイプライン並列処理もサポートされており、この処理では、
TPFORWARルーチンを使用して1つのサービスから別のサービスに処理が渡されます(転送)。
TPFORWARルーチンの詳細は、
『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の
「サーバーのコーディング」を参照してください。
TPACALL(3cbl)ルーチンは、サービス・リクエストを送信し、ただちに戻します。
TPACALLルーチンの呼出しには、次のシグネチャを使用します。
01
TPSVCDEF-REC.
COPY TPSVCDEF.
01
TPTYPE-REC.
COPY TPTYPE.
01
DATA-REC.
COPY User Data.
01
TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPACALL" USING
TPSVCDEF-REC TPTYPE-REC DATA-REC TPSTATUS-REC.
TPSVCDEFおよび
TPTYPE-RECデータ構造体の詳細は、
『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の
「サービスの定義」を参照してください。
TPACALLルーチンは、
SERVICE-NAMEに指定されたサービスにリクエスト・メッセージを送信し、ただちに制御を戻します。呼出しが正常に終了すると、
TPACALLルーチンは整数値を戻し、この値は、関連するリクエストに対する正しい応答にアクセスするための通信ハンドルとして使用されます。
TPACALLがトランザクション・モード(
『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の
「グローバル・トランザクションのコーディング」を参照)の場合、トランザクションのコミット時に未処理の応答が存在することはなく、あるトランザクションの範囲内では、リクエストごとにその応答が返されるため、最終的には対応する応答を必ず受信することになります。
TPNOREPLYが設定されると、応答が必要ないことがパラメータで
TPACALLに通知されます。これが設定されている場合、
TPACALLの処理が正常に終了すると、応答記述子として
0の値が戻されます。以降の処理で、この値が
TPGETRPLYルーチンに渡されると、この値は無効になります。プロセスがトランザクション・モードの場合にこの設定を正しく使用するためのガイドラインは、
『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の
「グローバル・トランザクションのコーディング」を参照してください。
エラーが発生した場合、
TPACALLは発生したエラーの内容を示す値を
TP-STATUSに設定します。
TPACALLが戻すエラー・コードの多くは、
TPCALLが戻すエラー・コードと同じです。これらの関数のエラー・コードは、一方が同期呼出し、もう一方が非同期呼出しに基づいているという点が異なります。これらのエラーの詳細は、
『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の
「エラーの管理」を参照してください。
次のサンプル・コードは、
TPACALLで
TPNOTRANと
TPNOREPLY設定を使用する方法を示しています。このコードは
6-8ページの「例: TPNOTRANフラグを設定した同期メッセージの送信」のコードと同様です。ただし、この場合は、
PRINTERサービスからの応答は要求されていません。
TPNOTRANと
TPNOREPLYの両方を設定することで、クライアントが応答を要求していないこと、および
PRINTERサービスが現在のトランザクションに参加しないことを示します。詳細は、
『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の
「エラーの管理」を参照してください。
リスト6-4
TPNOTRANまたはTPNOREPLYを設定した非同期メッセージの送信
WORKING-STORAGE SECTION.
*****************************************************
* Tuxedo definitions
*****************************************************
01 ITPTYPE-REC.
COPY TPTYPE.
01 OTPTYPE-REC.
COPY TPTYPE.
*
01 TPSTATUS-REC.
COPY TPSTATUS.
*
01 TPSVCDEF-REC.
COPY TPSVCDEF.
*****************************************************
01 REPORT-REQUEST PIC X(100) VALUE SPACES.
01 REPORT-OUTPUT PIC X(50000) VALUE SPACES.
******************************************************
PROCEDURE DIVISION.
START-FIG.
. . .
join application
start transaction
. . .
********************************************************
* Send report request to REPORT service
* Receive results into REPORT-OUTPUT
********************************************************
MOVE "REPORT=accrcv DBNAME=accounts" TO REPORT-REQUEST.
MOVE "STRING" TO REC-TYPE IN ITPTYPE-REC.
MOVE 29 TO LEN IN ITPTYPE-REC.
MOVE "STRING" TO REC-TYPE IN OITYPE-REC.
MOVE 50000 TO LEN IN OTPTYPE-REC.
MOVE "REPORT" TO SERVICE-NAME.
SET TPTRAN TO TRUE.
SET TPBLOCK TO TRUE.
SET TPNOTIME TO TRUE.
SET TPSIGRSTRT TO TRUE.
SET TPREPLY TO TRUE.
SET TPNOCHANGE TO TRUE.
CALL "TPCALL" USING TPSVCDEF-REC
ITPTYPE-REC
REPORT-REQUEST
OTPTYPE-REC
REPORT-OUTPUT
TPSTATUS-REC.
IF NOT TPOK
error processing
IF TPETRUNCATE
The report was truncated
error processing
********************************************************
* Send REPORT-OUTPUT to PRINTER service
********************************************************
MOVE "PRINTER" TO SERVICE-NAME.
SET TPNOTRAN TO TRUE.
SET TPNOREPLY TO TRUE.
MOVE "STRING" TO REC-TYPE IN ITPTYPE-REC.
MOVE LEN IN OTPTYPE-REC TO LEN IN ITPTYPE-REC.
CALL "TPACALL" USING TPSVCDEF-REC
ITPTYPE-REC
REPORT-OUTPUT
TPSTATUS-REC.
IF NOT TPOK
error processing
. . .
commit transaction
leave application
サービス呼出しに対する応答は、
TPGETRPLY(3cbl)ルーチンを呼び出すと非同期的に受信できます。
TPGETRPLYルーチンは、
TPACALLが以前に送信したリクエストに対する応答をキューから取り出します。
TPGETRPLYルーチンの呼出しには、次のシグネチャを使用します。
01
TPSVCDEF-REC.
COPY TPSVCDEF.
01
TPTYPE-REC.
COPY TPTYPE.
01
DATA-REC.
COPY User Data.
01
TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPGETRPLY" USING
TPSVCDEF-REC TPTYPE-REC DATA-REC TPSTATUS-REC.
TPSVCDEFおよび
TPTYPE-RECデータ構造体の詳細は、
『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の
「サービスの定義」を参照してください。
デフォルトでは、この関数は通信ハンドルが参照する値に対応した応答を待ちます。応答を待っている間に、ブロッキング・タイムアウトが発生する場合があります。タイムアウトが発生するのは、
TPGETRPLYが失敗し、
TP-STATUSに
TPETIMEが設定された場合です。ただし、
TPNOTIMEが設定されている場合は除きます。
TPSPRIO(3cbl)と
TPGPRIO(3cbl)という2つのATMI呼出しを使用して、メッセージ・リクエストの優先度を決定および設定できます。この優先度に従って、サーバーがキューからリクエストを取り出します。つまり、最も優先度の高いリクエストが最初に取り出されます。
TPSPRIO(3cbl)ルーチンを使用すると、メッセージ・リクエストの優先度を設定できます。
TPSPRIOルーチンで優先度を設定できるのは、1つのリクエストだけです。つまり、
TPCALLまたは
TPACALLによって次に送信されるリクエスト、またはサービス・サブルーチンによって次に転送されるリクエストだけです。
TPSPRIOルーチンの呼出しには、次のシグネチャを使用します。
01
TPPRIDEF-REC.
COPY TPPRIDEF.
01
TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPSPRIO" USING
TPPRIDEF-REC TPSTATUS-REC.
TPPRIDEF-RECデータ構造体の呼出しには、次のシグネチャを使用します。
05
PRIORITY PIC S9(9) COMP-5.
05
PRIO-FLAG PIC S9(9) COMP-5.
88 TPABSOLUTE VALUE 0.
88 TPRELATIVE VALUE 1.
表6-1は、
TPSPRIOルーチンの引数を示しています。
|
|
|
新しい優先度を示す整数値。この引数の持つ意味は、 PRIO-FLAGによって異なります。 PRIO-FLAGにゼロが設定されている場合、 PRIORITYは相対値を示し、値の符号は現在の優先度を上げることまたは下げることを示します。ほかの値が設定されている場合、指定された値は絶対値を示し、 PRIORITYには0 - 100の範囲の値を設定する必要があります。この範囲外の値を設定すると、値は50に設定されます。
|
|
PRIORITYの値を相対値(0)または絶対値( TPABSOLUTE)のどちらの値として処理するのかを示す値。デフォルトは相対値です。
|
以下のサンプル・コードは、
TRANSFERサービスから引用したものです。このコードでは、
TRANSFERサービスはクライアントとして動作し、
TPCALLを使用して
WITHDRAWALサービスに同期要求を送信しています。
TRANSFERは
TPSPRIOを呼び出して
WITHDRAWALに対するリクエスト・メッセージの優先度を上げます。また、
TRANSFERのキューを待機した後で、
WITHDRAWALサービス(その後
DEPOSITサービス)に対するリクエストがキューに格納されないようにします。
リスト6-5
リクエスト・メッセージの優先度の設定
WORKING-STORAGE SECTION.
*****************************************************
* Tuxedo definitions
*****************************************************
01 TPTYPE-REC.
COPY TPTYPE.
*
01 TPSTATUS-REC.
COPY TPSTATUS.
*
01 TPSVCDEF-REC.
COPY TPSVCDEF.
*
01 TPPRIDEF-REC.
COPY TPPRIDEF.
*****************************************************
01 DATA-REC PIC X(100) VALUE SPACES.
******************************************************
PROCEDURE DIVISION.
START-FIG.
. . .
join application
. . .
MOVE 30 TO PRIORITY.
SET TPRELATIVE TO TRUE.
CALL "TPSPRIO" USING TPPRIDEF-REC TPSTATUS-REC
IF NOT TPOK
error processing
MOVE "CARRAY" TO REC-TYPE.
MOVE 100 TO LEN.
MOVE "WITHDRAWAL" TO SERVICE-NAME.
SET TPTRAN TO TRUE .
SET TPBLOCK TO TRUE .
SET TPNOTIME TO TRUE .
SET TPSIGRSTRT TO TRUE .
SET TPREPLY TO TRUE .
CALL "TPACALL" USING TPSVCDEF-REC
TPTYPE-REC
DATA-REC
TPSTATUS-REC.
IF NOT TPOK
error processing
. . .
leave application
TPGPRIO(3cbl)ルーチンを使用すると、メッセージ・リクエストの優先度を取得できます。
TPGPRIOルーチンの呼出しには、次のシグネチャを使用します。
01
TPPRIDEF-REC.
COPY TPPRIDEF.
01
TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPGPRIO" USING
TPPRIDEF-REC TPSTATUS-REC.
リクエスタは、
TPCALLまたは
TPACALLルーチンを呼び出した後に
TPGPRIOルーチンを呼び出して、リクエスト・メッセージの優先度を取得できます。リクエスタが関数を呼び出したがリクエストが送信されていない場合、ルーチンは失敗し、
TP-STATUSに
TPENOENTが設定されます。
TPGPRIOの処理が成功すると、
TP-STATUSに
TPOKが設定され、1 - 100の範囲内の整数値が返されます。100が最も高い優先度です。
TPSPRIOルーチンを使用して優先度が明示的に設定されていない場合、要求を処理するサービス・ルーチンの優先度がメッセージの優先度として設定されます。アプリケーション内では、リクエストを処理するサービスの優先度にデフォルト値の50が設定されます。ただし、システム管理者が別の値を指定している場合は除きます。
次のサンプル・コードは、非同期呼出しによって送信されたメッセージの優先度を確認する方法を示しています。
WORKING-STORAGE SECTION.
*****************************************************
* Tuxedo definitions
*****************************************************
01 TPTYPE-REC-1.
COPY TPTYPE.
01 TPTYPE-REC-2.
COPY TPTYPE.
*
01 TPSTATUS-REC.
COPY TPSTATUS.
*
01 TPSVCDEF-REC-1.
COPY TPSVCDEF.
01 TPSVCDEF-REC-2.
COPY TPSVCDEF.
*
01 TPPRIDEF-REC-1.
COPY TPPRIDEF.
01 TPPRIDEF-REC-2.
COPY TPPRIDEF.
*****************************************************
01 DATA-REC-1 PIC X(100) VALUE SPACES.
01 DATA-REC-2 PIC X(100) VALUE SPACES.
******************************************************
PROCEDURE DIVISION.
START-FIG.
. . .
join application
populate DATA-REC1 and DATA-REC2 with send request
. . .
MOVE "CARRAY" TO REC-TYPE IN TYPE-REC-1.
MOVE 100 TO LEN IN TYPE-REC-1.
MOVE "SERVICE1" TO SERVICE-NAME IN TPSVCDEV-REC-1.
SET TPTRAN TO TRUE IN TPSVCDEV-REC-1.
SET TPBLOCK TO TRUE IN TPSVCDEV-REC-1.
SET TPNOTIME TO TRUE IN TPSVCDEV-REC-1.
SET TPSIGRSTRT TO TRUE IN TPSVCDEV-REC-1.
SET TPREPLY TO TRUE IN TPSVCDEV-REC-1.
CALL "TPACALL" USING TPSVCDEF-REC-1
TPTYPE-REC-1
DATA-REC-1
TPSTATUS-REC.
IF NOT TPOK
error processing
CALL "TPGPRIO" USING TPPRIDEF-REC-1 TPSTATUS-REC
IF NOT TPOK
error processing
MOVE "CARRAY" TO REC-TYPE IN TYPE-REC-2.
MOVE 100 TO LEN IN TYPE-REC-2.
MOVE "SERVICE2" TO SERVICE-NAME IN TPSVCDEV-REC-2.
SET TPTRAN TO TRUE IN TPSVCDEV-REC-2.
SET TPBLOCK TO TRUE IN TPSVCDEV-REC-2.
SET TPNOTIME TO TRUE IN TPSVCDEV-REC-2.
SET TPSIGRSTRT TO TRUE IN TPSVCDEV-REC-2.
SET TPREPLY TO TRUE IN TPSVCDEV-REC-2.
CALL "TPACALL" USING TPSVCDEF-REC-2
TPTYPE-REC-2
DATA-REC-2
TPSTATUS-REC.
IF NOT TPOK
error processing
CALL "TPGPRIO" USING TPPRIDEF-REC-2 TPSTATUS-REC
IF NOT TPOK
error processing
IF PRIORITY IN TPSVCDEF-REC-1 >= PRIORITY IN TPSVCDEF-REC-2
PERFORM DO-GETREPLY1
PERFORM DO-GETREPLY2
ELSE
PERFORM DO-GETREPLY2
PERFORM DO-GETREPLY1
END-IF.
. . .
leave application
DO-GETRPLY1.
SET TPGETHANDLE TO TRUE IN TPSVCDEV-REC-1.
SET TPCHANGE TO TRUE IN TPSVCDEV-REC-1.
SET TPBLOCK TO TRUE IN TPSVCDEV-REC-1.
SET TPNOTIME TO TRUE IN TPSVCDEV-REC-1.
SET TPSIGRSTRT TO TRUE IN TPSVCDEV-REC-1.
CALL "TPGETRPLY" USING TPSVCDEF-REC-1
TPTYPE-REC-1
DATA-REC-1
TPSTATUS-REC.
IF NOT TPOK
error processing
DO-GETRPLY2
SET TPGETHANDLE TO TRUE IN TPSVCDEV-REC-2.
SET TPCHANGE TO TRUE IN TPSVCDEV-REC-2.
SET TPBLOCK TO TRUE IN TPSVCDEV-REC-2.
SET TPNOTIME TO TRUE IN TPSVCDEV-REC-2.
SET TPSIGRSTRT TO TRUE IN TPSVCDEV-REC-2.
CALL "TPGETRPLY" USING TPSVCDEF-REC-2
TPTYPE-REC-2
DATA-REC-2
TPSTATUS-REC.
IF NOT TPOK
error processing