![]() |
![]() |
|
|
同期メッセージの送信
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 データ構造体の詳細については、「サービスの定義」を参照してください。IDATA-REC および ITPTYPE-REC 構造体は、要求レコードを定義します。ODATA-REC および OTPTYPE-REC 構造体は、応答レコードを定義します。ITPTYPE-REC および OTPTYPE-REC データ構造体は、TPTYPE-REC データ構造体と似ています。「サービスの定義」を参照してください。
TPCALL は、応答を待ちます。
注記 TPCALL ルーチンの呼び出しは、TPACALL ルーチンを呼び出した直後に TPGETRPLY を呼び出すことと論理的には同じです。「非同期メッセージの送信」を参照してください。
要求は、指定されたサービス (SERVICE-NAME) の優先順位で送信されます。ただし、TPSPRIO ルーチンの呼び出しで明示的に異なる優先順位が設定されている場合は除きます。詳細については、「メッセージの優先順位の設定および取得」を参照してください。
TPCALL は整数を返します。失敗した場合、発生したエラー条件を示す値が TP-STATUS に設定されます。有効なエラー・コードの詳細については、『BEA Tuxedo COBOL リファレンス』の TPCALL(3cbl) を参照してください。
注記 通信呼び出しはいろいろな原因で失敗します。そのほとんどは、アプリケーション・レベルで修正することができます。失敗の原因としては、アプリケーション定義のエラー (TPESVCFAIL)、戻り値の処理エラー (TPESVCERR)、型付きレコードのエラー (TPEITYPE、TPEOTYPE)、タイム・アウト・エラー (TPETIME)、プロトコル・エラー (TPEPROTO) などがあります。エラーの詳細については、「エラーの管理」を参照してください。発生する可能性があるエラーについては、『BEA Tuxedo COBOL リファレンス』の TPCALL(3cbl) を参照してください。
BEA Tuxedo システムでは、割り当てられているレコードより大きなメッセージを受信した場合、メッセージ受信用レコードのサイズが自動的に変更されます。そのため、応答レコードのサイズが変更されたかどうかを確認する必要があります。
レコードの新しいサイズにアクセスするには、*LEN IN OTPTYPE-REC に返されたアドレスを使用します。応答レコードのサイズが変更されたかどうかを確認するには、TPCALL を呼び出す前の応答レコードのサイズと、返された応答レコードの LEN IN OTPTYPE-REC の値とを比較します。LEN IN OTPTYPE-REC が元の値より大きい場合、レコードのサイズは大きくなっています。それ以外の場合、レコードのサイズは変更されていません。
例: 要求メッセージと応答メッセージに同じレコードを使用する
以下のコード例は、クライアント・プログラムで、要求メッセージと応答メッセージに同じレコードを使用して、同期呼び出しを行う方法を示しています。この例では、AUDV-REC メッセージ・レコードは要求情報と応答情報の両方を格納するように設定されているので、同じレコードを使用することができます。このコードでは、次の処理が行われます。
要求メッセージと応答メッセージに同じレコードを使用する
WORKING-STORAGE SECTION.
*****************************************************
* Tuxedo の定義
*****************************************************
01 TPTYPE-REC.
COPY TPTYPE.
*
01 TPSTATUS-REC.
COPY TPSTATUS.
*
01 TPSVCDEF-REC.
COPY TPSVCDEF.
*****************************************************
* ログ・メッセージの定義
*****************************************************
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).
*****************************************************
* この VIEW レコード (audv) はサーバに送られます。
*****************************************************
01 AUDV-REC.
COPY AUDV.
*
******************************************************
PROCEDURE DIVISION.
START-FIG.
MOVE LENGTH OF LOGMSG TO LOGMSG-LEN.
*****************************************************
* audv レコードを準備します。
*****************************************************
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 は、BEA Tuxedo システムに提供されている銀行業務のサンプル・アプリケーションです。この例では、あるサービスがクライアントとして WITHDRAWAL および DEPOSIT サービスを呼び出します。アプリケーションはこの 2 つのサービスを呼び出すときに通信フラグを TPSIGRSTRT に設定して、トランザクションをコミットしやすいようにします。TPSIGRSTRT フラグは、シグナルの割り込みがあった場合に行う処理を指定します。通信フラグの詳細については『BEA Tuxedo COBOL リファレンス』の TPCALL(3cbl) を参照してください。
TPSIGRSTRT フラグを設定した同期メッセージの送信
WORKING-STORAGE SECTION.
*****************************************************
* Tuxedo の定義
*****************************************************
01 TPTYPE-REC.
COPY TPTYPE.
*
01 TPSTATUS-REC.
COPY TPSTATUS.
*
01 TPSVCDEF-REC.
COPY TPSVCDEF.
*****************************************************
* この VIEW レコード (audv) はサーバに送られます。
*****************************************************
01 AUDV-REC.
COPY AUDV.
*
******************************************************
PROCEDURE DIVISION.
START-FIG.
*****************************************************
* 引き出し用に audv レコードを準備します。
*****************************************************
. . .
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.
. . .
*****************************************************
* 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 を設定した非同期メッセージの送信」では、同じ例を使用して非同期メッセージの呼び出しを行っています。
TPNOTRAN フラグを設定した同期メッセージの送信
WORKING-STORAGE SECTION.
*****************************************************
* Tuxedo の定義
*****************************************************
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
. . .
******************************************************
* REPORT サービスにレポート要求を送ります。
* 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
******************************************************
* PRINTER サービスに REPORT-OUTPUT を送ります。
******************************************************
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 形式で標準化したが、それを反映するためにクライアント・プロセスを変更しなかった場合などがあります。
![]() |
![]() |
![]() |
|
Copyright © 2001 BEA Systems, Inc. All rights reserved.
|