COBOLを使用したOracle Tuxedoアプリケーションのプログラミング

     前  次    新規ウィンドウで目次を開く    PDFとして表示 - 新規ウィンドウ  Adobe Readerを入手 - 新規ウィンドウ
コンテンツはここから始まります

クライアントおよびサーバーへのリクエスト/レスポンスのコーディング

このトピックには次の項が含まれます:

 


リクエスト/レスポンス通信の概要

リクエスト/レスポンス通信モードでは、あるソフトウェア・モジュールが別のソフトウェア・モジュールにリクエストを送り、レスポンスを待ちます。最初のソフトウェア・モジュールがクライアント、2番目のソフトウェア・モジュールがサーバーとして動作するため、このモードはクライアント/サーバー相互作用とも呼ばれます。オンラインの銀行業務の多くは、リクエスト/レスポンス・モードでプログラミングされます。たとえば、残高照会のリクエストは、次のように行われます。

  1. 顧客(クライアント)は、口座レコード管理システム(サーバー)に、残高照会のリクエストを送信します。
  2. 口座レコード管理システム(サーバー)は、指定された口座の残高を応答として顧客(クライアント)に送ります。
  3. 図6-1 オンライン銀行業務でのリクエスト/レスポンス通信


    オンライン銀行業務でのリクエスト/レスポンス通信

クライアント・プロセスはアプリケーションに参加すると、リクエスト・メッセージをサブルーチンに送信して処理を行い、応答メッセージを受信できるようになります。

 


同期メッセージの送信

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は、応答を待ちます。

注: TPCALLルーチンの呼出しは、TPACALLルーチンを呼び出した直後にTPGETRPLYを呼び出すことと論理的には同じです。「非同期メッセージの送信」を参照してください。

リクエストは、指定されたサービス(SERVICE-NAME)の優先度で送信されます。ただし、TPSPRIOルーチンの呼出しで明示的に異なる優先度が設定されている場合は除きます。詳細は、「メッセージの優先度の設定および取得」を参照してください。

TPCALLは整数を返します。失敗した場合、発生したエラー条件を示す値がTP-STATUSに設定されます。有効なエラー・コードの詳細は、『Oracle Tuxedo ATMI COBOL関数リファレンス』「TPCALL(3cbl)」を参照してください。

注: 通信呼出しは様々な原因で失敗しますが、そのほとんどは、アプリケーション・レベルで修正できます。失敗の原因としては、アプリケーション定義のエラー(TPESVCFAIL)、戻り値の引数の処理エラー(TPESVCERR)、型付きレコードのエラー(TPEITYPETPEOTYPE)、タイムアウト・エラー(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はリクエストされたサービス名を示します。この例では、口座残高と窓口残高が示されます。
  4. リスト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にはこのレコードに入るだけのメッセージが格納されます。残りのメッセージは破棄され、TPCALLTP-STATUS IN TPSTATUS-RECTPTRUNCATEを設定します。

例: TPSIGRSTRTフラグを設定した同期メッセージの送信

以下のサンプル・コードは、bankappXFERサーバー・プロセスの一部である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サービスはハードコピーの印刷が終了したことをクライアントに通知します。

注: 「TPNOTRANまたはTPNOREPLYを設定した非同期メッセージの送信」では、同じ例を使用して非同期メッセージの呼出しを行っています。
リスト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形式で標準化したが、それを反映するためにクライアント・プロセスを変更しなかった場合などがあります。

 


非同期メッセージの送信

この項では、次の操作を行う方法について説明します。

この項で説明する非同期の処理は、ファンアウト並列処理と呼ばれます。クライアントのリクエストが複数のサービスに同時に分散(ファンアウト)されて処理が行われるからです。

この他に、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アプリケーションのプログラミング』「エラーの管理」を参照してください。

次のサンプル・コードは、TPACALLTPNOTRANTPNOREPLY設定を使用する方法を示しています。このコードは、「例: TPNOTRANフラグを設定した同期メッセージの送信」のコードと同じです。ただし、この場合は、PRINTERサービスからの応答は要求されていません。TPNOTRANTPNOREPLYの両方を設定することで、クライアントが応答を要求していないこと、および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-STATUSTPETIMEが設定された場合です。ただし、TPNOTIMEが設定されている場合は除きます。

 


メッセージの優先度の設定および取得

2つのATMI呼び出し、TPSPRIO (3cbl)およびTPGPRIO (3cbl)を使用して、メッセージ要求の優先度を決定したり設定したりできます。この優先度に従って、サーバーがキューからリクエストを取り出します。つまり、最も優先度の高いリクエストが最初に取り出されます。

この項では、次の内容について説明します。

メッセージの優先度の設定

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ルーチンの引数を示しています。

表6-1 TPSPRIOルーチンのフィールド
フィールド
説明
PRIORITY
新しい優先度を示す整数値。この引数の持つ意味は、PRIO-FLAGによって異なります。PRIO-FLAGにゼロが設定されている場合、PRIORITYは相対値を示し、値の符号は現在の優先度を上げることまたは下げることを示します。ほかの値が設定されている場合、指定された値は絶対値を示し、PRIORITYには0 - 100の範囲の値を設定する必要があります。この範囲外の値を設定すると、値は50に設定されます。
PRIO-FLAG
PRIORITYの値を相対値(0)または絶対値(TPABSOLUTE)のどちらの値として処理するのかを示す値。デフォルトは相対値です。

以下のサンプル・コードは、TRANSFERサービスから引用したものです。このコードでは、TRANSFERサービスはクライアントとして動作し、TPCALLを使用してWITHDRAWALサービスに同期要求を送信しています。TRANSFERTPSPRIOを呼び出して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-STATUSTPENOENTが設定されます。TPGPRIOの処理が成功すると、TP-STATUSTPOKが設定され、1 - 100の範囲内の整数値が返されます。100が最も高い優先度です。

TPSPRIOルーチンを使用して優先度が明示的に設定されていない場合、要求を処理するサービス・ルーチンの優先度がメッセージの優先度として設定されます。アプリケーション内では、リクエストを処理するサービスの優先度にデフォルト値の50が設定されます。ただし、システム管理者が別の値を指定している場合は除きます。

次のサンプル・コードは、非同期呼出しによって送信されたメッセージの優先度を確認する方法を示しています。

リスト6-6 送信後のリクエストの優先度の確認
   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

  先頭に戻る       前  次