5.1.3 リクエスト/レスポンス型サービスの通信
XATMIインタフェースの,リクエスト/レスポンス型サービスの通信形態について説明します。
- 〈この項の構成〉
(1) リクエスト/レスポンス型サービスの種類
リクエスト/レスポンス型サービスの通信形態の種類を次に示します。
(a) 同期的に応答を受信する通信
サービスを要求してから,応答が返ってくるのを待つ通信です。サービスの要求には,関数tpcall()【TPCALL】を使います。
(監視時間について)
同期的に応答を受信する通信では,応答が返るまでの待ち時間を監視します。最大応答待ち時間は,OpenTP1の定義で指定します。定義については,マニュアル「OpenTP1 システム定義」を参照してください。
tpcall()を呼び出したプロセスがトランザクション下にある場合,最大応答待ち時間は,定義のtrn_expiration_timeオペランドで指定した値となります。この場合,最大応答待ち時間を過ぎると,そのプロセスは異常終了します(tpcall()はエラーリターンしません)。
tpcall()を呼び出したプロセスがトランザクション下にない場合,最大応答待ち時間は,定義のwatch_timeオペランドで指定した値となります。この場合,最大応答待ち時間を過ぎると,tpcall()はエラーリターンします。
同期的に応答を受信するリクエスト/レスポンス型サービスの通信形態を次の図に示します。
|
(b) 非同期に応答を受信する通信
サービスを要求してから,応答が返ってくるのを待たないで,処理を続ける通信です。その後,応答を受信する関数を使って,応答を受信します。サービスの要求には,関数tpacall()【TPCALL】を使います。そして,応答を受信するための関数tpgetrply()【TPGETRPLY】を使います。
(監視時間について)
非同期に応答を受信する通信では,tpgetrply()で応答を受信するまで待ちます。最大応答待ち時間は,OpenTP1の定義で指定します。定義については,マニュアル「OpenTP1 システム定義」を参照してください。
tpacall(),またはtpgetrply()を呼び出したプロセスがトランザクション下にある場合,最大応答待ち時間は,定義のtrn_expiration_timeオペランドで指定した値となります。この場合,最大応答待ち時間を過ぎると,そのプロセスは異常終了します(tpgetrply()はエラーリターンしません)。
tpacall(),またはtpgetrply()を呼び出したプロセスがトランザクション下にない場合,最大応答待ち時間は,定義のwatch_timeオペランドで指定した値となります。この場合,最大応答待ち時間を過ぎると,tpgetrply()はエラーリターンします。
非同期に応答を受信するリクエスト/レスポンス型サービスの通信形態を次の図に示します。
|
(c) 応答を返さない通信
サービス要求の処理結果が戻らない通信です。応答を返さない通信では,関数tpacall()のフラグにTPNOREPLYを設定して使います。ただし,tpacall()のフラグにTPNOTRANも合わせて設定する必要があります。
非応答型の通信でサービス要求をした場合,応答は受信できません。サービスを要求したUAPは,処理を続けます。
応答を返さないリクエスト/レスポンス型サービスの通信形態を次の図に示します。
|
(2) リクエスト/レスポンス型サービスの通信の時間監視
リクエスト/レスポンス型サービスの通信では,時間監視はすべてOpenTP1の定義に指定した値に従います。定義については,マニュアル「OpenTP1 システム定義」を参照してください。
タイムアウトには,トランザクション処理がタイムアウトになったことを示すトランザクションタイムアウトと,ブロッキング状態の待ちによるタイムアウトによるブロッキングタイムアウトがあります。トランザクションタイムアウトが起こった場合,そのプロセスは異常終了します。
設定したタイムアウト値を超えて,処理を待つ場合もあります(該当のデータでない応答が返ってきても,OpenTP1の監視タイマはリセットされるため)。また,フラグにTPNOTIMEを設定した場合は,タイムアウト値を無限大とします。ただし,トランザクションタイムアウトはこのフラグの有無に関係なく起こります。
(3) リクエスト/レスポンス型サービスの通信とトランザクションの関係
OpenTP1で使えるトランザクション管理の関数(dc_trn_〜,またはtx_〜)でトランザクションを制御します。OpenTP1でのトランザクション決着,またはrollback_only状態かどうかは,サービス関数の処理結果,またはトランザクションを制御する関数によって決定されます。ただし,リクエスト/レスポンス型サービスでは,次に示すエラーが起こると,該当のトランザクションブランチをrollback_only状態とします。
-
トランザクションタイムアウトが発生(プロセスは異常終了します)。
-
型付きバッファ受信のエラー(受信した型が,許可されていない)。
-
TPESVCERR,TPESVCFAILエラーの発生(tpreturn()のエラー通知,または,tpreturn()を使ったユーザからのエラー通知)。
-
TPESYSTEMエラーの発生(ただし,TPESYSTEMがリターンしてもrollback_only状態とならない場合もあります)。
(a) 同期的に応答を受信する通信のトランザクション管理
呼び出し側がトランザクション下にある場合,呼び出すサービスをトランザクションとして処理するかどうかは,関数tpcall()の引数flagsに設定したパラメタで決まります。呼び出すサービスをトランザクションとしない場合に限り,TPNOTRANを設定してください。TPNOTRANを設定しても,トランザクションタイムアウトは起こります。
(b) 非同期的に応答を受信する通信のトランザクション管理
呼び出し側がトランザクション下にある場合,呼び出すサービスをトランザクションとして処理するかどうかは,関数tpacall()の引数flagsに設定したパラメタで決まります。呼び出すサービスをトランザクションとしない場合に限り,TPNOTRANを設定してください。TPNOTRANを設定しても,トランザクションタイムアウトは起こります。
(c) 応答を返さない通信のトランザクション管理
応答を返さない通信はトランザクションとして処理できません。関数tpacall()の引数flagsにTPNOTRANを必ず設定してください。
(4) ブロッキング状態が発生した場合の処置
リクエスト/レスポンス型サービスの通信関数には,ブロッキング状態の場合の処置を示すTPNOBLOCKフラグがあります。このフラグを設定したtpgetrply()は,ブロッキング状態を検知した時点でエラーリターンします。このフラグを設定しないと,ブロッキング状態が解決するまで待つか,またはタイムアウトとなります(ただし,TPNOTIMEを設定していれば,ブロッキング状態が原因でのタイムアウトとはなりません)。OpenTP1では,このフラグが有効になるのは,tpgetrply()だけです。tpcall(),tpacall()でこのフラグを設定しても無効となります。