Hitachi

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


TPGETRPLY

〈このページの構成〉

名称

リクエスト/レスポンス型サービスからの非同期応答の受信

形式

01 TPSVCDEF-REC.
   COPY  TPSVCDEF.
01 TPTYPE-REC.
   COPY  TPTYPE.
01 DATA-REC.
   COPY  Data record definition.
01 TPSTATUS-REC.
   COPY  TPSTATUS.
 
CALL "TPGETRPLY" USING TPSVCDEF-REC TPTYPE-REC DATA-REC TPSTATUS-REC.

機能

TPGETRPLYは,先に送信したサービス要求の応答をリターンします。TPGETRPLYは,特定のサービス要求の応答か,または有効な不特定な応答を返します。どちらを返すかを示すオプションについて,次に説明します。

DATA-RECには,読む応答がどこにあるかを,そしてLENにはDATA-RECに入れるバイトの最大値を設定します。TPGETRPLYが正常リターンすると,LENにはDATA-RECに入った実際の長さが設定されます。REC-TYPEとSUB-TYPEにはそれぞれ,データのtypeとsubtypeが設定されます。DATA-RECの値よりも応答が大きい場合は,DATA-RECにはレコードに入るだけのバイトが格納されます。応答の残りの部分は捨てられて,TPGETRPLYはTPTRUNCATEを返します。

TPGETRPLYが正常に終了した場合に,LENが0であるときは,応答にはデータ部がなく,DATA-RECは変更されません。LENに0を設定した場合はエラーになります。

『データ領域』

『●TPSVCDEF-REC

TPGETRPLYの動作を示す値と通信ハンドルを設定します。設定する値と意味は,以降説明します。』

『●TPTYPE-REC

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

『●DATA-REC

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

『●TPSTATUS-REC

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

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

TPGETANY

この値は,TPGETRPLYは入力時にCOMM-HANDLEに設定した通信ハンドルを無視して,受信できる何らかの応答がある場合はそれをリターンして,返ってきた応答の通信ハンドルを出力のCOMM-HANDLEに設定することを意味します。応答がなくて,この値を設定していない場合は,TPGETRPLYは応答の到着を待ちます。TPGETANYまたはTPGETHANDLEのどちらかを,必ず設定してください。

TPGETHANDLE

この値は,TPGETRPLYは入力時にCOMM-HANDLEで示す通信ハンドルを使い,出力時にはこの通信ハンドルに有効な応答だけを返すことを意味します。応答がない場合は,TPGETRPLYは応答の到着を待ちます。TPGETANYまたはTPGETHANDLEのどちらかを,必ず設定してください。

TPNOCHANGE

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

TPCHANGE

受信レコードのtypeとsubtypeがREC-TYPEまたはSUB-TYPEと異なっていても,受け取り側が認識する限り,受信を許可することを示します。TPNOCHANGEまたはTPCHANGEのどちらかを,必ず設定してください。

TPNOBLOCK

TPGETRPLYは応答の到着を待ちません。応答が有効である場合,TPGETRPLYは応答を受信してリターンします。TPNOBLOCKまたはTPBLOCKのどちらかを,必ず設定してください。

TPBLOCK

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

TPNOTIME

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

TPTIME

呼び出し側にブロッキング状態が起こればブロッキングタイムアウトを受信して,ブロッキング時間に到着することを示します。TPNOTIMEまたはTPTIMEのどちらかを,必ず設定してください。

TPSIGRSTRT

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

TPNOSIGRSTRT

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

以下,特に記述しないかぎり,応答を受信したあとは,COMM-HANDLEは無効になります。

リターン値

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

エラー

次のような場合,TPGETRPLYはエラーリターンして,次のうちどれか一つの値をTP-STATUSに設定します。

TPGETHANDLEを設定した場合,特別な場合を除いてCOMM-HANDLEは無効になります。応答が戻ってくる前にエラーが起こった場合は,COMM-HANDLEには0が設定されます。特に示さないかぎり,呼び出し側がトランザクション下にあった場合でも,失敗は呼び出し側のトランザクションに影響を与えません。

TPEINVAL

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

TPEBADDESC

COMM-HANDLEに間違った通信ハンドルを設定しています。

TPEOTYPE

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

TPETIME

タイムアウトが起こりました。呼び出し側がトランザクションモードの場合,これはトランザクションタイムアウトで,トランザクションはrollback_only状態となります。そうでない場合は,TPNOBLOCKもTPNOTIMEも設定されていない状態で,ブロッキングタイムアウトが起こったことを意味します。呼び出し側がトランザクションモードでないかぎり(そして,TPGETANYが設定されていないかぎり),COMM-HANDLEは有効です。トランザクションタイムアウトが起こった場合は,トランザクションをロールバックするまでは,新しく送信しようとしていた送信や,解決していない応答は,TPETIMEでエラーリターンします。

TPESVCFAIL

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

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

TPESVCERR

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

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

TPEBLOCK

TPNOBLOCKを設定していたときに,ブロッキング状態になりました。COMM-HANDLEは有効なままです。

TPEGOTSIG

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

TPEPROTO

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

TPESYSTEM

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

TPEOS

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

関連項目

TPACALL,TPCANCEL,TPRETURN

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

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

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

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

  4. 『TPACALLで,呼び出したサービスが使えない型のレコードをサービスに渡していた場合,TPACALLは正常リターンして,TPGETRPLYでエラーとなります。TPGETRPLYでTPESYSTEMまたはTPESVCERRのエラーが起こった場合は,TPACALLの実行結果も確認してください。』

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

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

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