Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 プログラム作成リファレンス COBOL言語編


TPCALL

〈このページの構成〉

名称

リクエスト/レスポンス型サービスの呼び出しと応答の受信

形式

01 TPSVCDEF-REC.
   COPY  TPSVCDEF.
01 ITPTYPE-REC.
   COPY  TPTYPE.
01 IDATA-REC.
   COPY  Data record definition.
01 OTPTYPE-REC.
   COPY  TPTYPE.
01 ODATA-REC.
   COPY  Data record definition.
01 TPSTATUS-REC.
   COPY  TPSTATUS.
 
CALL "TPCALL" USING TPSVCDEF-REC ITPTYPE-REC IDATA-REC
                    OTPTYPE-REC ODATA-REC TPSTATUS-REC.

機能

TPCALLは,サービス要求を送信して,同期的に応答を待ちます。TPCALLの実行は,TPACALLを実行して,すぐにTPGETRPLYを実行するのと同じことです。TPCALLはSERVICE-NAMEが示すサービスにサービス要求を送信します。サービス要求のデータ部は,IDATA-RECで設定されています。ITPTYPE-RECのLENには,IDATA-RECをどれだけ送信するかを設定します。

Note:IDATA-RECが,長さを指定する必要がないレコード型を指す場合は,ITPTYPE-RECのLENは無視されます(0にしてください)。IDATA-RECが,長さを指定する必要があるレコード型を指す場合は,ITPTYPE-RECのLENには0は設定しないでください。ITPTYPE-RECのREC-TYPEにsubtypeがない場合は,ITPTYPE-RECのSUB-TYPEは無視されます(SPACES(空白)を設定してください)。ITPTYPE-RECのREC-TYPEがSPACES(空白)の場合は,IDATA-RECと(ITPTYPE-RECの)LENは無視されて,サービス要求はデータ部がないデータで送信されます。ITPTYPE-RECのREC-TYPEとITPTYPE-RECのSUB-TYPEは,SERVICE-NAMEで示すサービスで認識しているtypeとsubtypeのうちのどれか一つに必ず一致させてください。

ODATA-RECは応答が読み込まれる応答がどこに格納するかを設定しています。データを入力するときには,OTPTYPE-RECのLENは,ODATA-RECの中に格納する必要があるバイトの最大数を示します。送信と受信に同じレコードを使う場合は,ODATA-RECをIDATA-RECにREDEFINES(再定義)する必要があります。TPCALLが正常に終了したあとで,OTPTYPE-RECのLENは,ODATA-RECに実際に格納したバイト数が設定されます。OTPTYPE-RECのREC-TYPEとOTPTYPE-RECのSUB-TYPEには,応答のtypeとsubtypeをそれぞれ格納しています。ODATA-RECの値よりも応答が大きい場合は,ODATA-RECにはレコードに入るだけのバイトが格納されます。応答の残りの部分は捨てられて,TPCALLはTPTRUNCATEを返します。

TPCALLが正常に終了した場合にOTPTYPE-RECのLENが0であるときは,応答にはデータ部がなく,ODATA-RECは変更されません。入力時にOTPTYPE-RECが0の場合は,エラーになります。

『データ領域』

『●TPSVCDEF-REC

TPCALLの動作を示す値を設定します。設定する値と意味は,以降説明します。』

『●ITPTYPE-REC

送信データのレコード型と,subtypeのレコード名を示します。』

『●IDATA-REC

送信データを示します。』

『●OTPTYPE-REC

受信データのレコード型,subtypeのレコード名を示します。』

『●ODATA-REC

受信データを示します。』

『●TPSTATUS-REC

TPCALLの実行結果を示すリターン値が設定されます。』

TPSVCDEF-RECには,次に示す値を設定します。

TPNOTRAN

呼び出し側がトランザクションモードで,かつ この値を設定している場合,起動されたSERVICE-NAMEは,呼び出し側のトランザクションの一部にはなりません。呼び出し側がトランザクションモードで,かつSERVICE-NAMEがトランザクション処理ができないサーバに属している場合は,この値を必ず設定してください。呼び出し側がトランザクションモードであれば,この値が設定されていても,トランザクションタイムアウトは起こります(トランザクションモードでなければ起こりません)。この値を設定して起動されたサービスが失敗しても,呼び出し側のトランザクションには影響しません。TPNOTRANまたはTPTRANのどちらかを,必ず設定してください。

TPTRAN

呼び出し側がトランザクションモードで,かつ この値を設定している場合,起動されたSERVICE-NAMEは,呼び出し側のトランザクションの一部になります。呼び出し側がトランザクションモードでない場合は,この値を設定しても無視されます。TPNOTRANまたはTPTRANのどちらかを,必ず設定してください。

TPNOCHANGE

この設定をする場合は,ODATA-RECの型は変換されません。応答レコードのtypeとsubtypeは,OTPTYPE-RECのREC-TYPEとOTPTYPE-RECのSUB-TYPEにそれぞれ一致させてください。TPNOCHANGEまたはTPCHANGEのどちらかを,必ず設定してください。

TPCHANGE

受信側が受け取ったレコードのタイプを認識できる場合に,応答レコードのtypeとsubtypeがOTPTYPE-RECのREC-TYPEとOTPTYPE-RECのSUB-TYPEと異なっていても受け付けることを示します。TPNOCHANGEまたはTPCHANGEのどちらかを,必ず設定してください。

TPNOBLOCK

ブロッキング状態の場合(例えば,送信しようとするメッセージで内部バッファが満杯),サービス要求は送信されません。

Note:これはTPCALLでデータを送信する場合にだけ起こります。ルーチンは応答を待つためにブロッキングします。TPNOBLOCKまたはTPBLOCKのどちらかを,必ず設定してください。

TPBLOCK

TPBLOCKを設定していて,ブロッキング状態のときは,呼び出し側は状況が収まるか,タイムアウト(トランザクションタイムアウト,またはブロッキングタイムアウト)が起こるまで,ブロッキングします。TPNOBLOCKまたはTPBLOCKのどちらかを,必ず設定してください。

TPNOTIME

呼び出し側を無期限にブロックして,ブロッキングタイムアウトが起こらないことを意味します。トランザクションタイムアウトは起こります。TPNOTIMEまたはTPTIMEのどちらかを,必ず設定してください。

TPTIME

ブロッキング状態になった場合に,ブロッキングタイムアウトの時間に達したときにブロッキングタイムアウトの通知を受け取ることを意味します。TPNOTIMEまたはTPTIMEのどちらかを,必ず設定してください。

TPSIGRSTRT

シグナルが実行中のシステムコールを中断したら,中断したシステムコールを再び呼びます。TPSIGRSTRTまたはTPNOSIGRSTRTのどちらかを,必ず設定してください。

TPNOSIGRSTRT

シグナルが実行中のシステムコールを中断したら,中断したシステムコールを再び呼ばないでルーチンは失敗します。TPSIGRSTRTまたはTPNOSIGRSTRTのどちらかを,必ず設定してください。

リターン値

成功した場合,TPCALLはTP-STATUSにTPOKを設定します。TP-STATUSにTPOKかTPESVCFAILが返された場合は,APPL-RETURN-CODEにはTPRETURNの処理でアプリケーションが定義した値が返されます。TPCALLが受信したデータの長さがOTPTYPE-RECのLENに設定した長さを超えた場合は,OTPTYPE-RECにTPTRUNCATEが設定され,OTPTYPE-RECのLENで示す長さ分だけ,ODATA-RECに格納されます。受信したデータの残りの部分は捨てられます。

エラー

次のような場合,TPCALLはエラーリターンして,次のうちどれか一つの値をTP-STATUSに設定します。特に示さないかぎり,失敗は呼び出し側のトランザクションに影響を与えません。

TPEINVAL

間違った引数が与えられました(例えば,TPSVCDEF-RECに設定した値が間違っている)。

TPENOENT

SERVICE-NAMEで示すサービスが存在しないので,送信できません。

TPEITYPE

ITPTYPE-RECのREC-TYPEとITPTYPE-RECのSUB-TYPEの組み合わせが,SERVICE-NAMEのtypeとsubtypeで使える形式ではありません。

TPEOTYPE

応答のtypeとsubtypeを,呼び出し側で認識できません。または,TPNOCHANGEを設定しているのに,OTPTYPE-RECのREC-TYPEとOTPTYPE-RECのSUB-TYPEが,サービスから送信されてきた応答のtypeとsubtypeに一致していません。このエラーが起こった場合,ODATA-RECもOTPTYPE-RECも変更されません。呼び出し側のトランザクションとしてサービス要求が実行されている場合は,応答を捨てるまで,トランザクションはrollback_only状態となります。

TPETRAN

SERVICE-NAMEがトランザクション処理ができないサーバに属しているのに,TPTRANを設定しています。

TPETIME

タイムアウトが起こりました。呼び出し側がトランザクションモードの場合は,これはトランザクションタイムアウトで,トランザクションはrollback_only状態となります。そうでない場合は,TPBLOCKとTPTIMEが設定された状態でブロッキングタイムアウトが起こったことを意味します。どちらの場合も,ODATA-RECもOTPTYPE-RECも変更されません。トランザクションタイムアウトが起こった場合は,トランザクションをロールバックするまでは,新しく送信しようとしていた送信や,完了していない応答は,TPETIMEでエラーリターンします。

TPESVCFAIL

呼び出し側の応答を送信するサービスルーチンが,TPFAILを設定したTPRETURNを呼び出しました。これは,アプリケーションレベルの失敗です。送信されたサービスの応答の内容は,ODATA-RECとして有効になります。サービス要求が呼び出し側の現在のトランザクションとして実行されている場合は,トランザクションはrollback_only状態となります。

トランザクションタイムアウトにならないかぎり,これ以降の通信は,ロールバックするまでの処理が実行されます。この処理は正常になるか,または無効になります(エラーリターンまたはイベントが通知されます)。呼び出し側のトランザクションとして実行された処理は,トランザクションが完了したときにロールバックされます。継続する処理を有効にする通信には,TPNOTRANを設定してください。トランザクション機能によって呼び出し側のトランザクションをロールバックする何らかの処理が実行されます。

TPESVCERR

このエラーは,サービスルーチンを呼び出しているときか,TPRETURNで完了するときに起こります(例えば,適切でない引数を設定した)。このエラーが起こったときは,応答のデータはリターンされません(つまり,ODATA-RECもOTPTYPE-RECも変わっていません)。サービスに応答する処理が呼び出し側のトランザクションとして実行された場合は,トランザクションはrollback_only状態になります。

トランザクションタイムアウトにならないかぎり,これ以降の通信は,ロールバックするまでの処理が実行されます。この処理は正常になるか,または無効になります(エラーリターンまたはイベントが通知されます)。継続する処理を有効にする通信には,TPNOTRANを設定してください。トランザクション機能によって,呼び出し側のトランザクションをロールバックする何らかの処理が実行されます。

TPEBLOCK

TPNOBLOCKを設定したTPCALLで送信したときに,ブロッキング状態になりました。

TPEGOTSIG

シグナルは受信されましたが,TPNOSIGRSTRTを設定しています。

TPEPROTO

TPCALLが間違った状況で呼ばれました。

TPESYSTEM

コミュニケーションリソースマネジャシステムでエラーが起こりました。厳密なエラーの性質は,product-specificな方法で定義されます。

TPEOS

オペレーティングシステムにエラーが起こりました。厳密なエラーの性質は,product-specificな方法で定義されます。

関連項目

TPACALL,TPGETRPLY,TPRETURN

『OpenTP1で使う場合の注意事項』

  1. 『該当バージョンのOpenTP1では,TPNOBLOCKの設定は無効となります。そのため,TPEBLOCKがTP-STATUSにリターンすることはありません。OpenTP1では,ブロッキング状態のため通信ができない場合は,ネットワークダウンが原因で通信ができない場合と同様に,TPESYSTEMをリターンする仕様となっています。』

  2. 『該当バージョンのOpenTP1では,TPNOTIMEの設定は応答受信時にだけ有効です。サービス要求の送信時にブロッキング状態が起こった場合は,TPNOTIMEの設定は無効です。』

  3. 『TPSIGRSTRTの設定は無効となります。この設定の有無に関係なく,シグナル受信時には,中断したシステムコールを再び呼びます。TPEGOTSIGがリターンすることはありません。』

  4. 『該当バージョンのOpenTP1では,TPEITYPEはリターンされません。SERVICE-NAMEで使えない型のレコードを渡した場合は,TPESYSTEMがリターンされます。呼び出し側がトランザクションモードの場合は,rollback_only状態となります。』

  5. 『OpenTP1では,トランザクションタイムアウトが起こったときには,そのプロセスは異常終了します。そのため,TPETIMEがリターンされるのは,ブロッキングタイムアウトの場合だけとなります。』

  6. 『該当バージョンのOpenTP1では,ロールバックする必要があるエラーは,X/Openで特に指定がないかぎり,TPESYSTEMとしています。ただし,TPESYSTEMがリターンしても,rollback_only状態とならない場合もあります。』

  7. 『サービス要求先のSPPが異常終了した場合,定義のwatch_timeに指定した時間よりも早くTPETIMEでリターンするときがあります。また,watch_timeに0(応答を無限に待つ)を指定している場合は,TPEPROTOでエラーリターンするときがあります。』

  8. 『OpenTP1のセキュリティ機能を使っている場合で,サービス要求が認証されなかったときは,TPEPROTOでエラーリターンします。サービス要求が認証されなかったことが原因かどうかは,UAPトレースの詳細情報で確認してください。』

  9. 『TP1/NET/OSI-TP-Extendedを使ったOSI TP通信では,回線障害はTPESVCERRでエラーリターンします。』

  10. 『TP1/NET/OSI-TP-Extendedを使ったOSI TP通信をする場合,送受信するデータの長さは NET/Library共通定義のNETバッファグループ定義 nettbufにあるlengthオペランドに指定した値を超えないようにしてください。』