|
リクエスト/レスポンス通信モードでは、あるソフトウェア・モジュールが別のソフトウェア・モジュールにリクエストを送り、レスポンスを待ちます。最初のソフトウェア・モジュールがクライアント、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ルーチンの呼出しは、TPACALLルーチンを呼び出した直後にTPGETRPLYを呼び出すことと論理的には同じです。「非同期メッセージの送信」を参照してください。 |
リクエストは、指定されたサービス(SERVICE-NAME)の優先順位で送信されます。ただし、TPSPRIOルーチンの呼出しで明示的に異なる優先順位が設定されている場合は除きます。詳細は、「メッセージの優先順位の設定および取得」を参照してください。
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メッセージ・レコードはリクエスト情報と応答情報の両方を格納するように設定されているので、同じレコードを使用することができます。このコードでは、次の処理が行われます。
B_IDフィールドに対して問合せを実行します。ただし、このフィールドを上書きしません。 BALANCEフィールドをゼロに初期化して、サービスから返される値を受け取る準備をします。 SERVICE-NAMEはリクエストされたサービス名を示します。この例では、口座残高と窓口残高が示されます。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を設定します。
以下のサンプル・コードは、bankappのXFERサーバー・プロセスの一部であるTRANSFERサービスに基づいています。(bankappは、Oracle Tuxedoシステムに提供されている銀行業務のサンプル・アプリケーションです。この例では、あるサービスがクライアントとしてWITHDRAWALおよびDEPOSITサービスを呼び出します。アプリケーションはこの2つのサービスを呼び出すときに通信フラグをTPSIGRSTRTに設定して、トランザクションをコミットしやすいようにします。TPSIGRSTRTフラグは、シグナルの割込みがあった場合に行う処理を指定します。通信フラグの詳細は、『Oracle Tuxedo ATMI COBOL関数リファレンス』の「TPCALL(3cbl)」を参照してください。
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.
. . .
以下のサンプル・コードは、トランザクション・モードではない通信呼出しを示しています。 この呼出しは、リソース・マネージャに関連していないサービスに対して行われます。サービスがトランザクションに参加するとエラーになります。 アプリケーションは、データベースACCOUNTSから取得した情報に基づいて生成された売掛金勘定レポートACCRVを出力します。
サービス・ルーチンREPORTは指定されたパラメータを解釈し、完了したレポートのバイト・ストリームを応答として送信します。 クライアントは、TPCALLを使用してPRINTERサービスにバイト・ストリームを送信します。PRINTERは、クライアントに近いプリンタにバイト・ストリームを送信します。 そして、応答が印刷されます。 最後に、PRINTERサービスはハードコピーの印刷が終了したことをクライアントに通知します。
| 注意: | 「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 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形式で標準化したが、それを反映するためにクライアント・プロセスを変更しなかった場合などがあります。
この項で説明する非同期の処理は、ファンアウト並列処理と呼ばれますが、これは、クライアントのリクエストを複数のサービスに同時に分散(ファンアウト)して処理できるためです。
この他に、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設定を使用する方法を示しています。このコードは、「例: TPNOTRANフラグを設定した同期メッセージの送信」のコードと同じです。ただし、この場合は、PRINTERサービスからの応答は要求されていません。TPNOTRANとTPNOREPLYの両方を設定することで、クライアントが応答を要求していないこと、およびPRINTERサービスが現在のトランザクションに参加しないことを示します。詳細は、『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の「エラーの管理」を参照してください。
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が設定されている場合は除きます。
2つのATMI呼び出し、TPSPRIO(3cbl)およびTPGPRIO(3cbl)を使用して、メッセージ・リクエストの優先順位を決定したり設定したりできます。この優先順位に従って、サーバーがキューからリクエストを取り出します。つまり、最も優先順位の高いリクエストが最初に取り出されます。
TPSPRIO(3cbl)ルーチンを使用すると、メッセージ・リクエストの優先順位を設定できます。
TPSPRIOルーチンで優先順位を設定できるのは、1つのリクエストだけです。つまり、TPCALLまたはTPACALLによって次に送信されるリクエスト、またはサービス・サブルーチンによって次に転送されるリクエストだけです。
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ルーチンの引数を示しています。
以下のサンプル・コードは、TRANSFERサービスから引用したものです。このコードでは、TRANSFERサービスはクライアントとして動作し、TPCALLを使用してWITHDRAWALサービスに同期リクエストを送信しています。TRANSFERはTPSPRIOを呼び出してWITHDRAWALに対するリクエスト・メッセージの優先順位を上げます。また、TRANSFERのキューを待機した後で、WITHDRAWALサービス(その後DEPOSITサービス)に対するリクエストがキューに格納されないようにします。
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)ルーチンを使用すると、メッセージ・リクエストの優先順位を取得できます。
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
|