Hitachi

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


CBLDCRPC('POLLANYR')

〈このページの構成〉

名称

処理結果の非同期受信

形式

PROCEDURE DIVISIONの指定

CALL 'CBLDCRPC' USING 一意名1

DATA DIVISIONの指定

01 一意名1.
   02 データ名A  PIC  X(8) VALUE  'POLLANYR'.
   02 データ名B  PIC  X(5).
   02 FILLER    PIC  X(3).
   02 データ名C  PIC  S9(9) COMP VALUE  ZERO.
   02 データ名D  PIC  S9(9) COMP.
   02 データ名E  PIC  S9(9) COMP.
   02 データ名F  PIC  S9(9) COMP.

機能

非同期応答型RPCでサービス要求した結果を非同期に受信します。

受信する非同期応答を特定する場合は,データ名Cに1,または17を設定します。この値を設定した場合は,データ名Eに設定した記述子をリターンした,非同期応答型RPCの応答を受信します。

受信する非同期応答を特定しない場合は,データ名Cに0,または16を設定します。このとき,データ名Eに設定した値は無視されます。データ名Cに0,または16を設定した CBLDCRPC('POLLANYR')が正常に終了すると,受信した非同期応答の記述子と同じ値がリターンされます。

CBLDCRPC('POLLANYR')は,次のどちらかの場合にリターンします。

CBLDCRPC('POLLANYR')が正常に終了すると,非同期応答型RPCを使ったCBLDCRPC('CALL ')の応答を格納する領域に,値が設定されます。

ステータスコードの一覧のあとに,次の説明を掲載しています。CBLDCRPC('POLLANYR')の詳しい説明を知りたいときに参照してください。

(1)CBLDCRPC('POLLANYR')のデータ名Fについて

(2)CBLDCRPC('POLLANYR')がエラーになるタイミング

(3)ステータスコード「00378」をリターンさせる指定

(4)ステータスコードと同期点処理の関係

(5)CBLDCRPC('POLLANYR')で応答が受け取れない場合

(6)CBLDCRPC('POLLANYR')を使うときの注意

UAPで値を設定するデータ領域

●データ名A

処理結果を非同期に受信することを示す要求コードを「VALUE 'POLLANYR'」と設定します。

●データ名C

次のどれかを設定します。

0…待ち時間の単位は秒で指定し,CBLDCRPC('POLLANYR')で受信する非同期の応答を特定しません。

1…待ち時間の単位は秒で指定し,データ名Eに設定された記述子をリターンした,非同期応答型RPCの応答を受信します。

16…待ち時間の単位はミリ秒で指定し,CBLDCRPC('POLLANYR')で受信する非同期の応答を特定しません。

17…待ち時間の単位はミリ秒で指定し,データ名Eに設定された記述子をリターンした,非同期応答型RPCの応答を受信します。

●データ名E

非同期応答型RPCのCBLDCRPC('CALL ')(データ名Cに2を設定)が正常に終了したときに返された,記述子を設定します。データ名Cに0,または16を設定した場合は,ここに設定した値は無視されます。

●データ名F

CBLDCRPC('POLLANYR')を呼び出してから,応答が返ってくるまでの待ち時間を秒単位で設定します。設定できる値は-1からS9(9)COMPで表せる最大の数までです。

CBLDCRPC('POLLANYR')で非同期応答を受信する場合は,UAPに設定した応答待ち時間を参照しません。

0を設定した場合は,データ名Cが0,または1を設定したとき,応答が返っていないと「00307」ですぐにエラーリターンします。データ名Cに16,または17を設定したとき,50ミリ秒として処理します。

-1を設定した場合は,応答が返るまで待ち続けます。

●データ名D

0を設定します。

OpenTP1から値が返されるデータ領域

●データ名B

ステータスコードが,5けたの数字で返されます。

●データ名D

受信した非同期応答の記述子が返されます。この記述子は,データ名Cに0,または16を設定したCBLDCRPC('POLLANYR')が正常に終了した場合に返されます。データ名Cに1,または17を設定したCBLDCRPC('POLLANYR')が正常に終了した場合には,0が設定されます。

ステータスコード

ステータスコード

意味

00000

正常に終了しました。

00321

非同期応答型RPCで要求したサービスの処理結果は,すべて受信しました。

00322

データ名Eに設定した記述子は存在しません。このステータスコードは,データ名Cに1を設定した場合に返されます。

00301

データ名に設定した値が間違っています。

要求コード(データ名A)が間違っている場合も含みます。

00302

CBLDCRPC('OPEN ')を呼び出していません。

00304

メモリが不足しました。

00306

ネットワークに障害が起こりました。

00307

CBLDCRPC('CALL ')の処理が時間切れ(タイムアウト)になりました。

サービスを要求されたSPPが,処理を完了する前に異常終了しました。

00308

CBLDCRPC('CALL ')のデータ名Gに設定した入力パラメタ長が,最大値を超えています。

00309

返ってきた応答が,クライアントUAPで用意した領域に入り切りません。

00310

CBLDCRPC('CALL ')のデータ名Fに設定したサービスグループは,定義されていません。

00311

CBLDCRPC('CALL ')のデータ名Eに設定したサービス名は,定義されていません。

00312

CBLDCRPC('CALL ')のデータ名Eに設定したサービス名があるサービスグループは,閉塞しています。

00313

CBLDCRPC('CALL ')のデータ名Eに設定したサービスは,終了処理中です。

00314

CBLDCRPC('CALL ')のデータ名Eに設定したサービスのUAPプロセスが,稼働していません。

データ名Fに-1を設定した場合に,サービスを要求されたSPPが,処理を完了する前に異常終了しました。

00315

CBLDCRPC('CALL ')のデータ名Eに設定したサービスがあるノードのOpenTP1が稼働していません。異常終了,停止中,終了処理中,および通信障害が起こったことが考えられます。

00316

CBLDCRPC('CALL ')に設定したサービスで,システムエラーが起こりました。

00317

CBLDCRPC('CALL ')に設定したサービスで,メモリが不足しました。

00318

システムエラーが起こりました。

00319

サービス関数がOpenTP1に返した応答の長さが,1からDCRPC_MAX_MESSAGE_SIZEで定義されている値の範囲にありません。

00320

サービスを要求されたノードにあるOpenTP1は,開始処理中です。

00323

メモリが不足しました。このステータスコードが返った場合は,トランザクションブランチをコミットできません。

00324

システムエラーが起こりました。このステータスコードが返った場合は,トランザクションブランチをコミットできません。

00325

設定したサービスで,システムエラーが起こりました。このステータスコードが返った場合は,トランザクションブランチをコミットできません。

00326

返ってきた応答が,クライアントUAPで用意した領域に入り切りません。このステータスコードが返った場合は,トランザクションブランチをコミットできません。

00327

ノード間負荷バランス機能およびノード間負荷バランス拡張機能の環境で,複数のSPPのトランザクション属性が一致していません。このステータスコードは,ノード間負荷バランス機能およびノード間負荷バランス拡張機能を使っているSPPにサービスを要求した場合にだけリターンされます。

00328

ドメイン修飾をしたサービスグループ名の,ドメイン名が間違っています。

00329

ドメイン修飾をしてサービスを要求しましたが,ドメイン代表スケジュールサービスのポート番号が見つかりません。

00356

サービスを要求されたソケット受信型サーバが,サービス要求を受け取れません。

00366

オンラインテスタを使っている環境で,テストモードのUAPからテストモードでないSPPへサービスを要求しています。または,テストモードでないUAPからテストモードのSPPへサービスを要求しています。

00370

サービスを要求されたSPPは,セキュリティ機能で保護されています。CBLDCRPC('CALL ')でサービスを要求したUAPには,SPPへのアクセス権限がありません。

00372

同時に起動できるトランザクションブランチの数を超えたため,トランザクションブランチを開始できません。

一つのトランザクションブランチから開始できる子トランザクションブランチの最大数を超えたため,トランザクションブランチを開始できません。

00378

サービスを要求されたSPPが,処理を完了する前に異常終了しました。このステータスコードは,ユーザサービス定義のrpc_extend_functionオペランドに"00000001"を指定したクライアントUAPの場合にだけリターンされます。rpc_extend_functionオペランドに"00000000"を指定,またはオペランドを省略した場合は,「00378」はリターンされないで,「00307」または「00314」がリターンされます。

注※

rpc_max_message_sizeオペランドを使用した場合,DCRPC_MAX_MESSAGE_SIZEの値(1メガバイト)ではなく,rpc_max_message_sizeオペランドに指定した値になります。

(1)CBLDCRPC('POLLANYR')のデータ名Cについて

非同期受信の監視時間は,応答が返るたびにリセットされます。そのため,受信する非同期応答を特定する(データ名Cに1,または17を設定)場合は,データ名Fに設定した時間を過ぎても,応答を受信できる場合があります。また,データ名Fに設定した時間を過ぎても,「00307」でエラーリターンしない場合もあります。

(2)CBLDCRPC('POLLANYR')がエラーになるタイミング

サービスを要求されたSPPが異常終了した場合,クライアントUAPでエラーが返るタイミングについて説明します。

サービスを実行するSPPが,処理が終わる前に異常終了すると,CBLDCRPC('POLLANYR')は「00307」でエラーリターンします。CBLDCRPC('POLLANYR')のデータ名Fに-1を設定している場合は,「00314」でエラーリターンします。

CBLDCRPC('POLLANYR')の時間監視でエラーになる場合

次に示す場合には,CBLDCRPC('POLLANYR')のデータ名Fに設定した時間が経過したあとで,「00307」でエラーリターンします。

  • SPPがあるノードのOpenTP1全体が異常終了した場合

  • サービス要求のデータがサーバUAPに届く前,またはサーバUAPの処理が完了してからクライアントUAPに結果が届く前に障害が起こった場合

(3)ステータスコード「00378」をリターンさせる指定

サービスを要求されたSPPが,処理を完了する前に異常終了したことを「00307」または「00314」以外のステータスコードで判別したい場合には,ユーザサービス定義のrpc_extend_functionオペランドに"00000001"を指定します。この指定をすると,上記のエラー時に「00378」がリターンされるようになります。rpc_extend_functionオペランドに"00000000"を指定,またはオペランドを省略した場合は,「00378」はリターンされないで,「00307」または「00314」がリターンされます。

(4)ステータスコードと同期点処理の関係

CBLDCRPC('POLLANYR')のステータスコードと同期点処理(コミット,ロールバック)の関係について説明します。ここで説明する内容は,サービス要求がトランザクション処理になる場合に該当します。トランザクションでないサービス要求(CBLDCRPC('CALL ')のデータ名Cに「32」を加算した場合も含む)には該当しません。

CBLDCRPC('POLLANYR')がエラーリターンしてもコミットとなる場合

サービスを要求されたサービスプログラムの異常終了や,ノードの障害,ネットワーク障害の場合でも,「00307」がリターンすることがあります。クライアントUAPがトランザクション処理でない場合は,「00307」が返っても,要求したサービスがあるSPPは正常終了していて,データベースへの更新などが実行されているときもあります。

ロールバック処理が必要なステータスコード

トランザクション処理から呼び出したCBLDCRPC('POLLANYR')がエラーリターンした場合,ステータスコードによっては,必ずトランザクションがロールバック(サーバUAPがrollback_only状態)になります。この場合,コミット,またはロールバックのどちらを実行しても,必ずロールバックになります。必ずロールバックになるCBLDCRPC('POLLANYR')のステータスコードを次に示します。

「00309」

「00311」

「00317」

「00319」

(5)CBLDCRPC('POLLANYR')で応答が受け取れない場合

非同期応答型RPCでサービスを要求したUAPが次に示すCOBOL-UAP作成用プログラムを呼び出すと,CBLDCRPC('POLLANYR')で応答を受け取れません。

  1. CBLDCRPC('DISCARDF')で,非同期応答の受信を拒否した場合

  2. トランザクションの処理の場合,同期点処理のCOBOL-UAP作成用プログラムでコミットまたはロールバックした場合

上記のCOBOL-UAP作成用プログラムを使ったあとで返ってきた応答は,破棄されます。非同期応答型RPCでは,上記のCOBOL-UAP作成用プログラムを呼び出す前に,必要な非同期の応答をCBLDCRPC('POLLANYR')ですべて受け取ってください。

(6)CBLDCRPC('POLLANYR')を使うときの注意

  1. CBLDCRPC('POLLANYR')を待ち時間0を設定(データ名Fに0を設定)して呼び出すと,マルチスレッド環境のスケジューリングの関係で,応答が到着していても受信できない場合があります。そのため,待ち時間0ですべての応答を受信する CBLDCRPC('POLLANYR')を呼び出すUAPは,無限ループになってしまうことがありますので,注意してください。

  2. 記述子を特定しない CBLDCRPC('POLLANYR')がエラーリターンした場合,エラーになった応答の記述子を特定できません。CBLDCRPC('POLLANYR')がエラーリターンしたときの該当する記述子がわかるようにしておきたい場合は,データ名Cに1,または17を設定しておいてください。