|
アプリケーション トランザクション モニタ インタフェース (ATMI) は、COBOL アプリケーションとトランザクション処理システムとの間に介在し、ATMI インタフェースと呼ばれています。このマニュアル ページでは、ATMI インタフェースの COBOL 言語バインディングについて説明します。このインタフェースは、リソースのオープンとクローズ、トランザクションの管理、レコード タイプの管理、要求/応答や会話サービス コールの呼び出しなどを行う各種のルーチンで構成されています。
ATMI マニュアル ページに記述されているルーチン群を読めば、これらがコミュニケーションのためのモデルであることが分かります。このモデルは、クライアント プログラムとサーバ プログラムが要求および応答の各メッセージを使用していかにコミュニケートできるかという観点から表現されています。
コミュニケーションの基本的パラダイムとして、要求/応答型と会話型の 2 つがあります。要求/応答型サービスは、サービス要求とそれに関わるデータによって呼び出されます。要求/応答型サービスは、要求を 1 つだけ受け取ることができ (該当サービス ルーチンに入った時点で)、かつ応答も 1 つだけ送信することができます (該当サービス ルーチンから戻った時点で)。一方、会話サービスは接続要求によって呼び出されます。このとき、オープンされた接続を参照する手段 (つまり、以後の接続ルーチンを呼び出す際に使用されるハンドル) が必要です。接続が確立され、サービス ルーチンが呼び出されると、以降、接続プログラムあるいは会話型サービスは、その接続が解除されるまでアプリケーションで定義されたようにデータの送受信を行えるようになります。
なお、プログラムは要求/応答と会話によるコミュニケーションのいずれも行うことができますが、両方のサービス要求を受け付けることはできません。以下の節では、これら 2 種類のコミュニケーション パラダイムについてその概要を説明します。
注意 : | Oracle Tuxedo ATMI のマニュアルでは、さまざまな場所でスレッドについて説明しています。Oracle Tuxedo システムは COBOL でのマルチスレッド化をサポートしていないので、「スレッド」という用語は、状況に応じてプロセス全体またはコンテキストのいずれかを指しているものと考えてください。次に例を示します。 |
要求/応答によるコミュニケーションの場合、クライアントは要求を送り、応答を受け取ることができる 1 つのプロセスと定義されています。定義によれば、クライアントは要求を受け取ったり、応答を送ったりすることはできません。その代わり、クライアントはいくつでも要求を送ることができ、またそれと同時に応答を待ったり、あるいは適宜ある一定数の応答を受け取ったりすることができます。場合によっては、クライアントは応答を必要としない要求を送ることもできます。TPINITIALIZE()
と TPTERM()
を使用すれば、クライアントは Oracle Tuxedo ATMI のアプリケーションと結合および分離することができます。
一方、要求/応答型サーバは一度に 1 つのサービス要求を受け取り、その要求に対して 1 つの応答を返すことができるプログラムと定義されています。サーバは特定の要求を処理しながら、一方で要求/応答型要求あるいは会話型要求を出し、それらの応答を受け取ることにより、クライアントのように働くこともできます。サーバはこうした能力の故に、リクエスタと呼ばれることもあります。ただし、クライアント プログララムとサーバ プログラムはどちらもリクエスタになることができます (実際、クライアントはリクエスタ以外の何物でもありません)。
要求/応答型サーバは別の要求/応答型サーバに要求を送る (転送する) ことができます。この場合、最初のサーバは受け取った要求を別のサーバに渡すだけで、応答を受け取ることは期待しません。この連鎖の中の最後のサーバがその要求に対する応答をもとのリクエスタに送ります。この転送ルーチンの利用によって、もとのリクエスタは最終的にその応答を受け取ることができるのです。
サーバとサービス ルーチンの利用から、Oracle Tuxedo ATMI アプリケーションの作成に構造化手法をとることが可能になります。サーバでは、アプリケーション作成者は、要求の受信や応答の送信といったコミュニケーションの詳細ではなく、サービスによって実行する事柄に関する作業に専念すればよいのです。コミュニケーション上の詳細の多くは Oracle Tuxedo システムが処理するため、サービス ルーチンを作成するときにはある一定の規則に従う必要があります。サーバは、そのサービス ルーチンを終了する時点で、TPRETURN()
を使用して応答を送ったり、あるいは TPFORWAR()
を使用して要求を転送したりできます。サービスはその他の作業を行ったり、この時点以後別のプログラムとコミュニケートすることは許されません。そのため、サーバが実行するサービスは、要求が受け取られたときに開始され、応答が送信あるいは要求が転送された時点で終了します。
要求メッセージと応答メッセージとの間には、本質的に異なる点があります。要求にはそれが送信される以前には関連するコンテキストはありませんが、応答にはあるという点です。たとえば、ある要求を送る際に、呼び出し側はアドレッシング情報を与えなければなりませんが、応答は常にその要求を出したプログラムに返されます。つまり、応答の場合には、要求が出されるときに与えられたアドレッシング情報が維持されていて、応答の送信側はそのあて先になんら手を加えることはできません。この両者の相違点については、TPCALL()
のルーチンのパラメータと説明で明らかにされています。
要求メッセージはその送信時に特定の優先順位が付与されます。この優先順位にしたがって、要求はキューから取り出されます。つまり、サーバはキューの中で最も優先順位の高い要求から順に取り出すのです。ただし、要求がいつまでもキューの中に残されてしまうのを防ぐために、優先順位に関係なく、最も長くキューに入っている要求が一定間隔で取り出されます。デフォルト設定では、要求の優先順位はその要求が送られるサービス名に対応させて付けられます。サービス名にはシステムのコンフィグレーション時に優先順位を与えることができます (「UBBCONFIG(5)」参照)。特に定義されていない場合には、デフォルトの優先順位が使用されます。この優先順位は、TPCALL()
に説明のあるルーチン (TPSPRIO()
) を使用して実行時に設定することができます。呼び出し側はこの方法により、メッセージ送信時にコンフィグレーションまたはデフォルトの優先順位を変更できます。
会話型のコミュニケーションの場合、クライアントは、会話接続を行うことはできるが、接続要求を受け付けることはできないプログラムと定義されています。
一方、会話サーバは、接続要求を受け取ることができるプログラムです。接続が確立され、サービス ルーチンが呼び出されると、以降、接続プログラムあるいは会話型サービスは、その接続が解除されるまでアプリケーションで定義されたようにデータの送受信を行えるようになります。会話は半二重方式で行われます。つまり、接続の一方の側が制御権をもってデータを送信し、他方の側は制御権を渡されるまではデータを送信できません。接続が確立されている間、サーバは「予約状態」になり、ほかのプログラムがそのサーバとの間で接続を確立することはできません。
要求/応答型サーバの場合と同様、会話型サーバは他の要求を出したり、他のサーバとの接続を行うことによりリクエスタとして機能できます。一方、要求/応答型サーバと異なり、会話サーバは要求を別のサーバに転送することはできません。このため、会話サーバによって実行される会話サービスは、要求を受け取った時点で開始され、TPRETURN()
を介して最終的な応答が送信された時点で終了します。
このため、会話サーバによって実行される会話サービスは、要求を受け取った時点で開始され、TPRETURN() を介して最終的な応答が送信された時点で終了します。メッセージは、アプリケーション側の規定に従って送受信することができます。要求メッセージ応答メッセージとの間には本質的な相違はなく、またメッセージの優先順位に関する規定もありません。
Oracle Tuxedo ATMI のキュー メッセージ モデルは、要求メッセージの完了を待たず、そのメッセージが後で処理されるようにキューに登録し、またオプションとしてキューに入れられた応答メッセージを介して応答が得られるようにします。メッセージをキューに登録したり応答をキューから取り出すための ATMI 関数は、TPENQUEUE()
と TPDEQUEUE()
です。これらの関数は、Oracle Tuxedo ATMI のアプリケーション プロセスの全ての型 (クライアント、サーバ、会話型) のいずれのプロセスからも呼び出せます。
キュー メッセージ機能は、XA 準拠のリソース マネージャで提供されます。永続的なメッセージはトランザクション内でキューへの登録および取り出しが行われ、高い信頼性で一度に処理されます。
Oracle Tuxedo システムは、トランザクションの定義および管理について、相互に排他的な 2 つの関数をサポートしています。Oracle Tuxedo システムの ATMI トランザクション境界関数 (名前の先頭が TP
) と X/Open の TX インタフェース関数 (名前の先頭が TX_
) です。X/Open では TX インタフェースのベースとして ATMI のトランザクション境界関数が使用されるので、TX インタフェースの構文およびセマンティクスは、ATMI とほとんど同じです。この項では、ATMI のトランザクション概念について概要を述べます。次の項では、TX インタフェースについて補足説明します。
Oracle Tuxedo システムにおけるトランザクションは、全体としてある結果を導く、あるいは何も結果を示さない 1 つの論理的な作業単位を定義するときに使用します。トランザクションにより、多くのプロセスによって (そして、おそらく様々な場所で) なされる作業を 1 つの作業単位として扱うことができます。トランザクションの開始者 (開始プロセス) は TPBEGIN()
および TPCOMMIT()
または TPABORT()
を使用してトランザクション内での操作内容を記述します。
開始プロセスはまた、TPSUSPEND()
を呼び出して現在のトランザクションでの作業を中断することもできます。他のプロセスが TPRESUME()
を呼び出して、中断されているトランザクションの開始プロセスの役割を引き継ぐこともできます。トランザクションの開始プロセスとして、プログラムは TPSUSPEND()
、TPCOMMIT()
、または TPABORT()
のいずれかを呼び出す必要があります。したがって、あるプロセスがトランザクションを終了し、別のプロセスがトランザクションを開始することができます。
サービスを呼び出すプログラムがトランザクション モードにあると、呼び出されたサービス ルーチンも同じトランザクションとなるためにトランザクション モードに入ります。このプロセスがトランザクション モードでない場合、サービスがトランザクション モードで呼び出されるかどうかは、コンフィグレーション ファイルにおいて該当サービスにどのようなオプションが指定されているかによって決まります。トランザクション モードで呼び出されないサービスは、それが呼び出された時点から終了時点までの間に複数のトランザクションを定義できます。一方、トランザクション モードで呼び出されたサービス ルーチンは、1 つのトランザクションにのみ関与し、終了するまでそのトランザクションでの作業を続けます。なお、接続をトランザクション モードにアップグレードすることはできません。会話中に TPBEGIN()
が呼び出されると、会話はそのトランザクションの外側で維持されます (TPCONNECT()
が TPNOTRAN
を設定して呼び出された場合と同様)。
別のプログラムによって起動されたトランザクションに加わるサービスを、「参加リソース」と呼びます。トランザクションは常に、1 つの開始プロセスをもち、かついくつかの参加リソースをもつことができます。同じトランザクションでの作業を行うためにサービスを 2 回以上呼び出すことができます。TPCOMMIT()
または TPABORT()
を呼び出すことができるのは、トランザクションの開始プロセス (つまり、TPBEGIN()
または TPRESUME()
のいずれかを呼び出すプログラム) だけです。参加リソースは、TPRETURN()
あるいは TPFORWAR()
を使用することによりトランザクションの結果に影響を与えます。これらの 2 つの呼び出しはそれぞれ、サービス ルーチンの終わり、およびそのルーチンがトランザクションの中で担当する部分を終了したことを示すものです。
TX インタフェースによって定義されるトランザクションは、ATMI 関数によって定義されるトランザクションと実質的に同じです。アプリケーションの開発者は、クライアント ルーチンおよびサービス ルーチンを作成するにあたり、どちらの関数でも使用できます。実際、Oracle Tuxedo システムでは、単一のアプリケーションにおけるクライアント プログラムおよびサーバ プログラムすべてに、必ずしもどちらかの 1 つの関数を使用する必要はありません。ただし、単一のプログラム内で 2 つの関数を一緒に使用することはできません。たとえば、同じプログラム内で TPBEGIN()
を呼び出した後に TXCOMMIT()
を呼び出すことはできません。
TX インタフェースには、移植性の高い方法でリソース マネージャのオープンとクローズを行う 2 つのコール、TXOPEN()
および TXCLOSE()
があります。トランザクションは、TXBEGIN()
で開始され、TXCOMMIT()
または TXROLLBACK()
のいずれかで完了します。TXINFORM()
はトランザクション情報を取り出すために使用されます。また、トランザクションにオプションを設定する 3 つの呼び出し TXSETCOMMITRET()
、TXSETTRANCTL()
、および TXSETTIMEOUT()
があります。TX インタフェースには、ATMI の TPSUSPEND()
と TPRESUME()
に相当するものはありません。
TX インタフェースには、ATMI トランザクションについて定義されているセマンティクスおよび規則の他にも、ここで説明しておくべきセマンティクスがいくつかあります。まず、TX インタフェースを使用するサービス ルーチン開発者は、TXOPEN()
を呼び出す独自の TPSVRINIT()
ルーチンを使用する必要があります。省略時に Oracle Tuxedo システムが提供する TPSVRINIT()
は、TPOPEN()
を呼び出します。TPSVRDONE()
についても同じことがあてはまります。TX インタフェースを使用している場合は、サービス ルーチン開発者は、TXCLOSE()
を呼び出す独自の TPSVRDONE()
を使用しなければなりません。
次に、TX インタフェースには、ATMI にはない別のセマンティクスが 2 つあります。それは、連鎖および非連鎖トランザクションと、トランザクション特性です。
TX インタフェースは、トランザクション実行の連鎖モードおよび非連鎖モードをサポートしています。省略時には、クライアント ルーチンおよびサービス ルーチンは、非連鎖モードで実行されます。この場合、アクティブなトランザクションが完了した際、新しいトランザクションは TXBEGIN()
が呼び出されるまで実行されません。
連鎖モードでは、新しいトランザクションは、現在のトランザクションが完了すると、暗黙に開始されます。つまり、TXCOMMIT()
または TXROLLBACK()
が呼び出されると、Oracle Tuxedo システムは、現在のトランザクションの完了を調整し、制御を呼び出し側に返す前に新しいトランザクションを開始します (異常終了の条件によっては、新しいトランザクションを開始できない場合もあります)。
クライアント ルーチンおよびサービス ルーチンは、TXSETTRANCTL()
を呼び出すことによって連鎖モードのオンとオフを切り替えます。連鎖モードと非連鎖モードの間の移行により、その次の TXCOMMIT()
コールまたは TXROLLBACK()
コールの動作が変わります。TXSETTRANCTL()
の呼び出しでは、呼び出し側のトランザクション モードのオンとオフの切り替えは行いません。
TXCLOSE()
は、呼び出し側がトランザクション モードにあるときには呼び出すことができないため、連鎖モードで実行中の呼び出し側が TXCLOSE()
を呼び出すには、非連鎖モードに切り替えて、現在のトランザクションを完了してから呼び出さなければなりません。
クライアント ルーチンまたはサービス ルーチンは、TXINFORM()
を呼び出すことによって、そのルーチンのトランザクション特性の現在の値を取得したり、そのルーチンがトランザクション モードで実行中であるかどうかを判別したりすることができます。
アプリケーション プログラムの状態には、いくつかのトランザクション特性があります。呼び出し側は、TXSET*
関数の呼び出しによってこれらの特性を指定します。クライアント ルーチンまたはサービス ルーチンが特性の値を設定している場合は、異なる値を呼び出し側が指定するまでは、その値が有効のままです。呼び出し側が TXINFORM()
を使用して特性の値を取得しても、これによって値が変更されることはありません。
Oracle Tuxedo ATMI システムには 3 種類のタイムアウトがあります。1 つはトランザクションの開始から終了までの期間に関連するもの、2 つめはブロッキング コールで呼び出し側が制御権を再度入手するまでブロック状態を維持する最大時間に関連するものです。3 つめはサービスのタイムアウトです。これは呼び出しの秒数がコンフィグレーション ファイルの SERVICES
セクションにおける SVCTIMEOUT
パラメータで指定された秒数を越えた時に発生します。
最初のタイムアウトは、TPBEGIN()
を使用してトランザクションを起動するときに指定します (詳細については、TPBEGIN()
を参照)。2 つめのタイムアウトは、TPCALL()
に定義されている Oracle Tuxedo ATMI のコミュニケーション ルーチンを使用する際に発生することがあります。これらのルーチンの呼び出し側は一般に、まだ届いていない応答を待っている間はブロック状態になります。これらの呼び出し側はデータの送信を行うこともブロックされることがあります (たとえば、要求キューがいっぱいの場合など)。呼び出し側がブロック状態になる最大時間は、Oracle Tuxedo ATMI のコンフィグレーション ファイルに記述されているパラメータによって決まります。詳細については、「UBBCONFIG(5)」の BLOCKTIME
パラメータの項を参照してください。
ブロッキング タイムアウトは呼び出し側がトランザクション モードにないときにデフォルトの設定によって実行されます。クライアントあるいはサーバがトランザクション モードにあると、そのトランザクションが開始したときに指定されたタイムアウト値が働き、UBBCONFIG
ファイルに指定されているブロッキング タイムアウト値の影響は受けません。
トランザクション タイムアウトが発生すると、トランザクション モードで行われた非同期の要求に対する応答は失効状態になることがあります。つまり、あるプログラムがトランザクション モードで送られた要求に対する特定の非同期応答の到着を待っているときに、トランザクション タイムアウトが発生すると、その応答のハンドルが無効になります。同様に、トランザクション タイムアウトが発生すると、トランザクションに関連する通信ハンドルに対してイベントが生成され、そのハンドルは無効になります。一方、ブロッキング タイムアウトが発生した場合、該当するハンドルは無効にならず、応答を待機しているプログラムはその応答を待機するための呼び出しを再度出すことができます。
サービス タイムアウト機構によって、未知の、または予期しないシステム エラーが原因でフリーズする可能性のあるプロセスについて、システムが強制終了を行うことができます。要求/応答サービス時にサービス タイムアウトが発生すると、Oracle Tuxedo システムによって、フリーズしたサービスを実行中のサーバ プロセスが強制終了され、エラーコード TPESVCERR
が戻ります。サービス タイムアウトが会話型サービスで発生した場合は、TPEV_SVCERR
イベントが返ります。
トランザクションがタイムアウトになった場合、トランザクションがアボートされる前に有効な通信は、TPNOREPLY
、TPNOTRAN
、および TPNOBLOCK
を設定した TPACALL()
の呼び出しだけです。
デフォルトの設定では、サーバのサービスは、サーバのブート時に宣言され、サーバの停止時にその宣言が解除されます。サーバは、それが提供するサービス セットに対する制御を実行時に必要とする場合、TPADVERTISE()
および TPUNADVERTISE()
を使用します。これらのルーチンは、該当サーバが複数サーバ/単一キュー セットに属していないかぎり、呼び出し側サーバが提供するサービスだけに影響します。MSSQ セットのサーバはすべて同じサービス セットを提供しなければならないため、これらのルーチンもまた呼び出し側の MSSQ セットを共有するすべてのサーバの宣言に影響します。
別のアプリケーション プログラムにデータを送信するために、アプリケーション プログラムは、まずそのデータをレコードに入れます。インタフェースは、
型付きレコードの概念をサポートしています。型付きレコードは、実際には、COBOL の 2 つのレコードからなります。データ レコードは、静的領域内に定義され、別のアプリケーション プログラムに渡すアプリケーション データが入ります。データ レコードには、補助型レコードが付加され、異なるマシン バウンダリ間にまたがってデータ レコードを渡す際に、Oracle Tuxedo システムに対し、データ レコードの解釈と変換の規則を識別します。補助型レコードには、データ レコードのタイプ、任意選択のサブタイプ、および任意選択のデータ長が入ります。レコード タイプによっては、特定のレコード レイアウトなど、サブタイプによる追加の指定が必要となる場合があり、可変長レコードには長さを指定する必要があります。
アプリケーション プログラマは、サポートされる 6 つの型付きレコードの中から 1 つを選択できます。Oracle Tuxedo システムでは、ユーザ固有の型付きレコードを追加することもできます。詳細については、『Oracle Tuxedo C リファレンス』の「C 言語アプリケーション トランザクション モニタ インタフェースについて」を参照してください。TPTYPE-REC
内の REC-TYPE
によって、アプリケーションで送信または受信しようとするレコード タイプを選択します。さらに細かい分類が必要な場合には、TPTYPE-REC
内の SUB-TYPE
も指定しなければなりません (たとえば、VIEW レコードなど)。TPTYPE-REC
内の LEN
によって、送信時には送信するバイト数を示し、受信時にはユーザのレコードに移動するバイト数を示します。サポートされる REC-TYPE
は次のとおりです。
CARRAY
CARRAY
では、任意の文字数を入れることが可能です。レコード内のどこかに LOW-VALUE
文字列が入ります。データ送信時には、LEN
に転送バイト数が入っていなければなりません。
STRING
STRING
は、任意の文字数を入れることが可能です。LOW-VALUE
文字列はレコード内には含まれず、レコードの末尾に付けられます。データ送信時には、LEN
に転送バイト数が入っていなければなりません。
VIEW
viewc()
コンパイラを使用して生成された COBOL レコードを記述します。VIEW
を使用する際には、SUB-TYPE
に VIEW の名前が入っていなければなりません。VIEW
タイプの送信時には、LEN
に転送バイト数を入れるか、そうでなければ NO-LENGTH
を設定しなければなりません。NO-LENGTH を設定すると、VIEW の長さ分が送信されます。
上記のレコード タイプの中の 2 つには、同等のタイプがあります。X_OCTET
は CARRAY
と同じであり、X_COMMON
は VIEW
と同じです。X_COMMON
は、VIEW
がサポートするデータ タイプのサブセットをサポートします。それらは、longs (PIC S9(9) COMP-5)
、shorts (PIC S9(4) COMP-5)
、および characters (PIC X(n))
です。X_COMMON
は、C と COBOL の両方のプログラムがやりとりする際に、使用してください。
どのタイプの場合でも、正常に転送が行われると、LEN
には転送されたバイト数が入ります。受信時には、LEN
には、データ領域に入る最大バイト数が入っていなければなりません。正常な呼び出しの後、LEN
は、データ領域に移動されたバイト数が入ります。着信メッセージのサイズが LEN
で指定されているサイズより大きいと、LEN
で指定されたデータ長分のみがデータ領域に移動され、残りのデータは破棄されます。
Oracle Tuxedo システムでは、ユーザ固有のレコード タイプを追加できます。詳細については、『Oracle Tuxedo C リファレンス』の「C 言語アプリケーション トランザクション モニタ インタフェースについて」の「バッファ タイプ スイッチ」を参照してください。
Oracle Tuxedo システムでは、クライアント プログラムはプロセスごとに 1 つまたは複数のアプリケーションとの関連を作成することができます。TPINFDEF-REC
の CONTEXTS-FLAG
に TP-MULTI-CONTEXTS
を設定して TPINITIALIZE()
が呼び出されると、複数のクライアント コンテキストを利用できます。TPINITIALIZE()
が暗黙的に呼び出された場合、または CONTEXTS-FLAG
に TP-MULTI-CONTEXTS
が設定されていない場合は、1 つのアプリケーションとの関連しか作成できません。
シングルコンテキスト モードで TPINITIALIZE()
が 2 回以上呼び出された場合 (つまり、クライアントがアプリケーションに参加した後で呼び出された場合) は、アクションは何も実行されず、成功を示す戻り値が返されます。
マルチコンテキスト モードでは、TPINITIALIZE()
の呼び出しのたびに新しいアプリケーションとの関連が作成されます。プログラムは TPGETCTXT()
を呼び出すことによりこのアプリケーション関連を表すハンドルを取得し、TPSETCTXT()
を呼び出してそのコンテキストを設定することができます。
アプリケーションでシングルコンテキスト モードが選択されると、すべてのアプリケーション関連が終了するまで、すべての TPINITIALIZE()
呼び出しでシングルコンテキスト モードを指定する必要があります。同様に、アプリケーションでマルチコンテキスト モードが選択されると、すべてのアプリケーション関連が終了するまで、すべての TPINITIALIZE()
呼び出しでマルチコンテキスト モードを指定する必要があります。
サーバ プログラムは 1 つのアプリケーションとしか関連付けられないため、クライアントとして機能することはありません。
注意 : | Oracle Tuxedo システムでは、1 プロセスで複数のアプリケーション コンテキストを利用できるほか、1 プロセスで複数のアプリケーション スレッドを使用できます。ただし、マルチスレッド機能は C 言語インタフェースでしかサポートされません。 |
次の表は、クライアント プロセス内で発生する、非初期化状態、シングルコンテキスト モードで初期化された状態、およびマルチコンテキスト モードで初期化された状態の遷移を示しています。
上記のように定義されたクライアント/サーバ間でのやりとりの境界外からメッセージをアプリケーション クライアントに送る方法は 2 通りあります。第 1 の方法は、TPBROADCAST()
によって実現されるブロードキャスト機構です。この関数により、アプリケーション クライアント、サーバおよび管理者は割り当てられた名前に基づいて選択されるクライアントに型付きレコード メッセージをブロードキャストすることができます。クライアントに割り当てられる名前は、一部はアプリケーションにより (特に、TPINFDEF-REC
データ構造体に TPINITIALIZE
実行時に渡される情報により)、また一部は (クライアントがアプリケーションのアクセスに使用するプロセッサに基づいて) システムにより決められます。
もう 1 つの方法は、以前のあるいは現在のサービス要求から識別される特定クライアントによる通知方法です。各サービス要求には、そのサービス要求を出したクライアントを特定するユニークなクライアント識別子が含まれています。サービス ルーチンの中から出される TPCALL()
および TPFORWAR()
関数の呼び出しは、そのサービス要求の連鎖に対応する元のクライアントを変更しません。クライアント識別子は保存しておき、アプリケーション サービス間で受け渡すことができます。この方法で識別されたクライアントに対する通知は、TPNOTIFY()
関数を使用して行います。
ATMI ルーチンは、次に挙げる戻り値と設定の定義を使用します。
*
* TPSTATUS.cbl
*
05 TP-STATUS PIC S9(9) COMP-5.
88 TPOK VALUE 0.
88 TPEABORT VALUE 1.
88 TPEBADDESC VALUE 2.
88 TPEBLOCK VALUE 3.
88 TPEINVAL VALUE 4.
88 TPELIMIT VALUE 5.
88 TPENOENT VALUE 6.
88 TPEOS VALUE 7.
88 TPEPERM VALUE 8.
88 TPEPROTO VALUE 9.
88 TPESVCERR VALUE 10.
88 TPESVCFAIL VALUE 11.
88 TPESYSTEM VALUE 12.
88 TPETIME VALUE 13.
88 TPETRAN VALUE 14.
88 TPEGOTSIG VALUE 15.
88 TPERMERR VALUE 16.
88 TPEITYPE VALUE 17.
88 TPEOTYPE VALUE 18.
88 TPERELEASE VALUE 19.
88 TPEHAZARD VALUE 20.
88 TPEHEURISTIC VALUE 21.
88 TPEEVENT VALUE 22.
88 TPEMATCH VALUE 23.
88 TPEDIAGNOSTIC VALUE 24.
88 TPEMIB VALUE 25.
88 TPEMAXVAL VALUE 26.
05 TPEVENT PIC S9(9) COMP-5.
88 TPEV-NOEVENT VALUE 0.
88 TPEV-DISCONIMM VALUE 1.
88 TPEV-SENDONLY VALUE 2.
88 TPEV-SVCERR VALUE 3.
88 TPEV-SVCFAIL VALUE 4.
88 TPEV-SVCSUCC VALUE 5.
05 TPSVCTIMOUT PIC S9(9) COMP-5.
88 TPED-NOEVENT VALUE 0.
88 TPEV-SVCTIMEOUT VALUE 1.
88 TPEV-TERM VALUE 2.
05 APPL-RETURN-CODE PIC S9(9) COMP-5.
TPTYPE
COBOL 構造体は、アプリケーション データの送受信時に必ず使用されます。REC-TYPE
は、送信されるデータ レコードのタイプを表します。SUB-TYPE
は、VIEW
REC-TYPE
が指定されている場合の VIEW の名前を表します。LEN
は、送信するデータのサイズおよび受信されるデータのサイズを表します。
*
* TPTYPE.cbl
*
05 REC-TYPE PIC X(8).
88 X-OCTET VALUE "X_OCTET".
88 X-COMMON VALUE "X_COMMON".
05 SUB-TYPE PIC X(16).
05 LEN PIC S9(9) COMP-5.
88 NO-LENGTH VALUE 0.
05 TPTYPE-STATUS PIC S9(9) COMP-5.
88 TPTYPEOK VALUE 0.
88 TPTRUNCATE VALUE 1.
TPSVCDEF
データ構造体は、Oracle Tuxedo システムと設定値をやりとりする関数によって使用されます。
*
* TPSVCDEF.cbl
*
05 COMM-HANDLE PIC S9(9) COMP-5.
05 TPBLOCK-FLAG PIC S9(9) COMP-5.
88 TPBLOCK VALUE 0.
88 TPNOBLOCK VALUE 1.
05 TPTRAN-FLAG PIC S9(9) COMP-5.
88 TPTRAN VALUE 0.
88 TPNOTRAN VALUE 1.
05 TPREPLY-FLAG PIC S9(9) COMP-5.
88 TPREPLY VALUE 0.
88 TPNOREPLY VALUE 1.
05 TPACK-FLAG PIC S9(9) COMP-5 REDEFINES TPREPLY-FLAG.
88 TPNOACK VALUE 0.
88 TPACK VALUE 1.
05 TPTIME-FLAG PIC S9(9) COMP-5.
88 TPTIME VALUE 0.
88 TPNOTIME VALUE 1.
05 TPSIGRSTRT-FLAG PIC S9(9) COMP-5.
88 TPNOSIGRSTRT VALUE 0.
88 TPSIGRSTRT VALUE 1.
05 TPGETANY-FLAG PIC S9(9) COMP-5.
88 TPGETHANDLE VALUE 0.
88 TPGETANY VALUE 1.
05 TPSENDRECV-FLAG PIC S9(9) COMP-5.
88 TPSENDONLY VALUE 0.
88 TPRECVONLY VALUE 1.
05 TPNOCHANGE-FLAG PIC S9(9) COMP-5.
88 TPCHANGE VALUE 0.
88 TPNOCHANGE VALUE 1.
05 TPSERVICETYPE-FLAG PIC S9(9) COMP-5.
88 TPREQRSP VALUE IS 0.
88 TPCONV VALUE IS 1.
*
05 APPKEY PIC S9(9) COMP-5.
05 CLIENTID OCCURS 4 TIMES PIC S9(9) COMP-5.
05 SERVICE-NAME PIC X(15).
TPINFDEF
データ構造体は、TPINITIALIZE()
によってアプリケーションに結合する際に使用されます。
*
* TPINFDEF.cbl
*
05 USRNAME PIC X(30).
05 CLTNAME PIC X(30).
05 PASSWD PIC X(30).
05 GRPNAME PIC X(30).
05 NOTIFICATION-FLAG PIC S9(9) COMP-5.
88 TPU-SIG VALUE 1.
88 TPU-DIP VALUE 2.
88 TPU-IGN VALUE 3.
05 ACCESS-FLAG PIC S9(9) COMP-5.
88 TPSA-FASTPATH VALUE 1.
88 TPSA-PROTECTED VALUE 2.
05 CONTEXTS-FLAG PIC S9(9) COMP-5.
88 TP-SINGLE-CONTEXT VALUE 0.
88 TP-MULTI-CONTEXTS VALUE 1.
05 DATALEN PIC S9(9) COMP-5.
TPCONTEXTDEF
データ構造体は、TPGETCTXT()
および TPSETCTXT()
がプログラムのコンテキストを操作する際に使用されます。
*
* TPCONTEXTDEF.cbl
*
05 CONTEXT PIC S9(9) COMP-5.
TPQUEDEF
データ構造体は、キューへのメッセージ登録に関連する情報を渡したり、取り出したりする際に、使用します。
*
* TPQUEDEF.cbl
*
05 TPBLOCK-FLAG PIC S9(9) COMP-5.
88 TPNOBLOCK VALUE 0.
88 TPBLOCK VALUE 1.
05 TPTRAN-FLAG PIC S9(9) COMP-5.
88 TPNOTRAN VALUE 0.
88 TPTRAN VALUE 1.
05 TPTIME-FLAG PIC S9(9) COMP-5.
88 TPNOTIME VALUE 0.
88 TPTIME VALUE 1.
05 TPSIGRSTRT-FLAG PIC S9(9) COMP-5.
88 TPNOSIGRSTRT VALUE 0.
88 TPSIGRSTRT VALUE 1.
05 TPNOCHANGE-FLAG PIC S9(9) COMP-5.
88 TPNOCHANGE VALUE 0.
88 TPCHANGE VALUE 1.
05 TPQUE-ORDER-FLAG PIC S9(9) COMP-5.
88 TPQDEFAULT VALUE 0.
88 TPQTOP VALUE 1.
88 TPQBEFOREMSGID VALUE 2.
05 TPQUE-TIME-FLAG PIC S9(9) COMP-5.
88 TPQNOTIME VALUE 0.
88 TPQTIME-ABS VALUE 1.
88 TPQTIME-REL VALUE 2.
05 TPQUE-PRIORITY-FLAG PIC S9(9) COMP-5.
88 TPQNOPRIORITY VALUE 0.
88 TPQPRIORITY VALUE 1.
05 TPQUE-CORRID-FLAG PIC S9(9) COMP-5.
88 TPQNOCORRID VALUE 0.
88 TPQCORRID VALUE 1.
05 TPQUE-REPLYQ-FLAG PIC S9(9) COMP-5.
88 TPQNOREPLYQ VALUE 0.
88 TPQREPLYQ VALUE 1.
05 TPQUE-FAILQ-FLAG PIC S9(9) COMP-5.
88 TPQNOFAILUREQ VALUE 0.
88 TPQFAILUREQ VALUE 1.
05 TPQUE-MSGID-FLAG PIC S9(9) COMP-5.
88 TPQNOMSGID VALUE 0.
88 TPQMSGID VALUE 1.
05 TPQUE-GETBY-FLAG PIC S9(9) COMP-5.
88 TPQGETNEXT VALUE 0.
88 TPQGETBYMSGIDOLD VALUE 1.
88 TPQGETBYCORRIDOLD VALUE 2.
88 TPQGETBYMSGID VALUE 3.
88 TPQGETBYCORRID VALUE 4.
05 TPQUE-WAIT-FLAG PIC S9(9) COMP-5.
88 TPQNOWAIT VALUE 0.
88 TPQWAIT VALUE 1.
05 TPQUE-DELIVERY-FLAG PIC S9(9) COMP-5.
88 TPQNODELIVERYQOS VALUE 0.
88 TPQDELIVERYQOS VALUE 1.
05 TPQUEQOS-DELIVERY-FLAG PIC S9(9) COMP-5.
88 TPQQOSDELIVERYDEFAULTPERSIST VALUE 0.
88 TPQQOSDELIVERYPERSISTENT VALUE 1.
88 TPQQOSDELIVERYNONPERSISTENT VALUE 2.
05 TPQUE-REPLY-FLAG PIC S9(9) COMP-5.
88 TPQNOREPLYQOS VALUE 0.
88 TPQREPLYQOS VALUE 1.
05 TPQUEQOS-REPLY-FLAG PIC S9(9) COMP-5.
88 TPQQOSREPLYDEFAULTPERSIST VALUE 0.
88 TPQQOSREPLYPERSISTENT VALUE 1.
88 TPQQOSREPLYNONPERSISTENT VALUE 2.
05 TPQUE-EXPTIME-FLAG PIC S9(9) COMP-5.
88 TPQNOEXPTIME VALUE 0.
88 TPQEXPTIME-ABS VALUE 1.
88 TPQEXPTIME-REL VALUE 2.
88 TPQEXPTIME-NONE VALUE 3.
05 TPQUE-PEEK-FLAG PIC S9(9) COMP-5.
88 TPQNOPEEK VALUE 0.
88 TPQPEEK VALUE 1.
05 DIAGNOSTIC PIC S9(9) COMP-5.
88 QMEINVAL VALUE -1.
88 QMEBADRMID VALUE -2.
88 QMENOTOPEN VALUE -3.
88 QMETRAN VALUE -4.
88 QMEBADMSGID VALUE -5.
88 QMESYSTEM VALUE -6.
88 QMEOS VALUE -7.
88 QMEABORTED VALUE -8.
88 QMEPROTO VALUE -9.
88 QMEBADQUEUE VALUE -10.
88 QMENOMSG VALUE -11.
88 QMEINUSE VALUE -12.
88 QMENOSPACE VALUE -13.
88 QMERELEASE VALUE -14.88 QMEINVHANDLE VALUE -15.
05 DEQ-TIME PIC S9(9) COMP-5.
88 QMESHARE VALUE -16.
05 EXP-TIME PIC S9(9) COMP-5.
05 PRIORITY PIC S9(9) COMP-5.
05 MSGID PIC X(32).
05 CORRID PIC X(32).
05 QNAME PIC X(15).
05 QSPACE-NAME PIC X(15).
05 REPLYQUEUE PIC X(15).
05 FAILUREQUEUE PIC X(15).
05 CLIENTID OCCURS4 TIMES PIC S9(9) COMP-5.
05 APPL-RETURN-CODE PIC S9(9) COMP-5.
05 APPKEY PIC S9(9) COMP-5.
TPSVCRET
データ構造体は、TPRETURN()
がトランザクションの状態を表す際に、使用されます。
*
* TPSVCRET.cbl
*
05 TP-RETURN-VAL PIC S9(9) COMP-5.
88 TPSUCCESS VALUE 0.
88 TPFAIL VALUE 1.
88 TPEXIT VALUE 2.
05 APPL-CODE PIC S9(9) COMP-5.
TPTRXDEF
データ構造体はトランザクション タイムアウトを設定するために TPBEGIN()
、トランザクション識別子を獲得するために TPSUSPEND()
、設定するために TPRESUME()
でそれぞれ使用されます。
*
* TPTRXDEF.cbl
*
05 T-OUT PIC S9(9) COMP-5 VALUE IS 0.
05 TRANID OCCURS 6 TIMES PIC S9(9) COMP-5.
TPCMTDEF
データ構造体は、TPSCMT()
がコミット レベル特性を設定する際に、使用されます。
*
* TPCMTDEF.cbl
*
05 CMT-FLAG PIC S9(9) COMP-5.
88 TP-CMT-LOGGED VALUE 1.
88 TP-CMT-COMPLETE VALUE 2.
05 PREV-CMT-FLAG PIC S9(9) COMP-5.
88 PREV-TP-CMT-LOGGED VALUE 1.
88 PREV-TP-CMT-COMPLETE VALUE 2.
TPAUTDEF
データ構造体は、TPCHKAUTH()
が認証の必要性を調べる際に、使用されます。
* TPAUTDEF.cbl
*
05 AUTH-FLAG PIC S9(9) COMP-5.
88 TPNOAUTH VALUE 0.
88 TPSYSAUTH VALUE 1.
88 TPAPPAUTH VALUE 2.
TPPRIDEF
データ構造体は、TPSPRIO()
および TPGPRIO()
がメッセージの優先順位を操作する際に、使用されます。
*
* TPPRIDEF.cbl
*
05 PRIORITY PIC S9(9) COMP-5.
05 PRIO-FLAG PIC S9(9) COMP-5.
88 TPABSOLUTE VALUE 0.
88 TPRELATIVE VALUE 1.
TPTRXLEV
データ構造体は、TPGETLEV()
がトランザクション レベル設定を取り出す際に使用されます。
*
* TPTRXLEV.cbl
*
05 TPTRXLEV-FLAG PIC S9(9) COMP-5.
88 TP-NOT-IN-TRAN VALUE 0.
88 TP-IN-TRAN VALUE 1.
TPBCTDEF
データ構造体は、TPNOTIFY()
および TPBROADCAST()
が通知を送る際に、使用されます。
*
* TPBCTDEF.cbl
*
05 TPBLOCK-FLAG PIC S9(9) COMP-5.
88 TPBLOCK VALUE 0.
88 TPNOBLOCK VALUE 1.
05 TPTIME-FLAG PIC S9(9) COMP-5.
88 TPTIME VALUE 0.
88 TPNOTIME VALUE 1.
05 TPSIGRSTRT-FLAG PIC S9(9) COMP-5.
88 TPNOSIGRSTRT VALUE 0.
88 TPSIGRSTRT VALUE 1.
05 LMID PIC X(30).
05 USERNAME PIC X(30).
05 CLTNAME PIC X(30).
FML-INFO
データ構造体は、FINIT()
、FVSTOF()
、および FVFTOS()
が FML バッファを扱う際に、使用されます。
*
* FMLINFO.cbl
*
05 FML-STATUS PIC S9(9) COMP-5.
88 FOK VALUE 0.
88 FALIGNERR VALUE 1.
88 FNOTFLD VALUE 2.
88 FNOSPACE VALUE 3.
88 FNOTPRES VALUE 4.
88 FBADFLD VALUE 5.
88 FTYPERR VALUE 6.
88 FEUNIX VALUE 7.
88 FBADNAME VALUE 8.
88 FMALLOC VALUE 9.
88 FSYNTAX VALUE 10.
88 FFTOPEN VALUE 11.
88 FFTSYNTAX VALUE 12.
88 FEINVAL VALUE 13.
88 FBADTBL VALUE 14.
88 FBADVIEW VALUE 15.
88 FVFSYNTAX VALUE 16.
88 FVFOPEN VALUE 17.
88 FBADACM VALUE 18.
88 FNOCNAME VALUE 19.
88 FEBADOP VALUE 20.
*
05 FML-LENGTH PIC S9(9) COMP-5.
*
05 FML-MODE PIC S9(9) COMP-5.
88 FUPDATE VALUE 1.
88 FCONCAT VALUE 2.
88 FJOIN VALUE 3.
88 FOJOIN VALUE 4.
*
05 VIEWNAME PIC X(33).
TPEVTDEF
データ構造体は、イベントの通知とサブスクリプションを処理するために TPPOST()
、TPSUBSCRIBE()
、および TPUNSUBSCRIBE()
が使用します。
*
* TPEVTDEF.cbl
*
05 TPBLOCK-FLAG PIC S9(9) COMP-5.
88 TPBLOCK VALUE 0.
88 TPNOBLOCK VALUE 1.
05 TPTRAN-FLAG PIC S9(9) COMP-5.
88 TPTRAN VALUE 0.
88 TPNOTRAN VALUE 1.
05 TPREPLY-FLAG PIC S9(9) COMP-5.
88 TPREPLY VALUE 0.
88 TPNOREPLY VALUE 1.
05 TPTIME-FLAG PIC S9(9) COMP-5.
88 TPTIME VALUE 0.
88 TPNOTIME VALUE 1.
05 TPSIGRSTRT-FLAG PIC S9(9) COMP-5.
88 TPNOSIGRSTRT VALUE 0.
88 TPSIGRSTRT VALUE 1.
05 TPEV-METHOD-FLAG PIC S9(9) COMP-5.
88 TPEVNOTIFY VALUE 0.
88 TPEVSERVICE VALUE 1.
88 TPEVQUEUE VALUE 2.
05 TPEV-PERSIST-FLAG PIC S9(9) COMP-5.
88 TPEVNOPERSIST VALUE 0.
88 TPEVPERSIST VALUE 1.
05 TPEV-TRAN-FLAG PIC S9(9) COMP-5.
88 TPEVNOTRAN VALUE 0.
88 TPEVTRAN VALUE 1.
*
05 EVENT-COUNT PIC S9(9) COMP-5.
05 SUBSCRIPTION-HANDLE PIC S9(9) COMP-5.
05 NAME-1 PIC X(31).
05 NAME-2 PIC X(31).
05 EVENT-NAME PIC X(31).
05 EVENT-EXPR PIC X(255).
05 EVENT-FILTER PIC X(255).
TPKEYDEF データ構造体は、メッセージ ベースのデジタル署名と暗号化を行うために使用する公開鍵とプライベート キーを管理する場合に、TPKEYCLOSE()
、TPKEYGETINFO()
、TPKEYOPEN()
、および TPKEYSETINFO()
によって使用されます。
*
* TPKEYDEF.cbl
*
05 KEY-HANDLE PIC S9(9) COMP-5.
05 PRINCIPAL-NAME PIC X(512).
05 LOCATION PIC X(1024).
05 IDENTITY-PROOF PIC X(2048).
05 PROOF-LEN PIC S9(9) COMP-5.
05 CRYPTO-PROVIDER PIC X(128).
05 SIGNATURE-FLAG PIC S9(9) COMP-5.
88 TPKEY-NOSIGNATURE VALUE 0.
88 TPKEY-SIGNATURE VALUE 1.
05 DECRYPT-FLAG PIC S9(9) COMP-5.
88 TPKEY-NODECRYPT VALUE 0.
88 TPKEY-DECRYPT VALUE 1.
05 ENCRYPT-FLAG PIC S9(9) COMP-5.
88 TPKEY-NOENCRYPT VALUE 0.
88 TPKEY-ENCRYPT VALUE 1.
05 AUTOSIGN-FLAG PIC S9(9) COMP-5.
88 TPKEY-NOAUTOSIGN VALUE 0.
88 TPKEY-AUTOSIGN VALUE 1.
05 AUTOENCRYPT-FLAG PIC S9(9) COMP-5.
88 TPKEY-NOAUTOENCRYPT VALUE 0.
88 TPKEY-AUTOENCRYPT VALUE 1.
05 ATTRIBUTE-NAME PIC X(64).
05 ATTRIBUTE-VALUE-LEN PIC S9(9) COMP-5.
TX ルーチンは、次に挙げる戻り値と設定の定義を使用します。
*
* TXSTATUS.cbl
*
05 TX-STATUS PIC S9(9) COMP-5.
88 TX-NOT-SUPPORTED VALUE 1.
* 正常実行
88 TX-OK VALUE 0.
* 正常実行
88 TX-OUTSIDE VALUE -1.
* アプリケーションが RM ローカル トランザクションにある。
88 TX-ROLLBACK VALUE -2.
* トランザクションがロールバックされた。
88 TX-MIXED VALUE -3.
* トランザクションが部分的にコミットされ、部分的に
* ロールバックされた。
88 TX-HAZARD VALUE -4.
* トランザクションが部分的にコミットされ、部分的に
* ロールバックされた可能性がある。
88 TX-PROTOCOL-ERROR VALUE -5.
* ルーチンが不適切なコンテキストで呼び出された。
88 TX-ERROR VALUE -6.
* 一時的なエラー
88 TX-FAIL VALUE -7.
* 致命的なエラー
88 TX-EINVAL VALUE -8.
* 無効な引数が指定された。
88 TX-COMMITTED VALUE -9.
* トランザクションがヒューリスティックにコミットされた。
88 TX-NO-BEGIN VALUE -100.
* トランザクションはコミットされ、新しいトランザクションは
* 開始できなかった。
88 TX-ROLLBACK-NO-BEGIN VALUE -102.
* トランザクションはロールバックされ、新しいトランザクションは
* 開始できなかった。
88 TX-MIXED-NO-BEGIN VALUE -103.
* 混合条件が発生し、新しいトランザクションが開始できなかった。
88 TX-HAZARD-NO-BEGIN VALUE -104.
* ハザードがあり、新しいトランザクションが開始できなかった。
88 TX-COMMITTED-NO-BEGIN VALUE -109.
* ヒューリスティックにコミットされ、トランザクションが
* 開始できなかった。
TXINFDEF
レコードは、TXINFORM()
コールの結果が格納されるデータ構造体を定義します。
*
* TXINFDEF.cbl
*
05 XID-REC.
* XID レコード
10 FORMAT-ID PIC S9(9) COMP-5.
* FORMAT-ID に値 -1 が入っている場合、XID は NULL
10 GTRID-LENGTH PIC S9(9) COMP-5.
10 BRANCH-LENGTH PIC S9(9) COMP-5.
10 XID-DATA PIC X(128).
05 TRANSACTION-MODE PIC S9(9) COMP-5.
* トランザクション モード設定
88 TX-NOT-IN-TRAN VALUE 0.
88 TX-IN-TRAN VALUE 1.
05 COMMIT-RETURN PIC S9(9) COMP-5.
* Commit_return 設定
88 TX-COMMIT-COMPLETED VALUE 0.
88 TX-COMMIT-DECISION-LOGGED VALUE 1.
05 TRANSACTION-CONTROL PIC S9(9) COMP-5.
* Transaction_control 設定
88 TX-UNCHAINED VALUE 0.
88 TX-CHAINED VALUE 1.
05 TRANSACTION-TIMEOUT PIC S9(9) COMP-5.
* Transaction_timeout 値
88 NO-TIMEOUT VALUE 0.
05 TRANSACTION-STATE PIC S9(9) COMP-5.
* Transaction_state 情報
88 TX-ACTIVE VALUE 0.
88 TX-TIMEOUT-ROLLBACK-ONLY VALUE 1.
88 TX-ROLLBACK-ONLY VALUE 2.
Oracle Tuxedo システムは、各プログラムの状態を記録し、各種の関数呼び出しやオプションごとに正当な状態遷移が行われているかどうかを検証します。この状態情報には、プログラムのタイプ (要求/応答型サーバ、会話サーバ、またはクライアント)、初期化状態 (初期化済み、非初期化)、リソースの管理状態 (クローズまたはオープン)、プログラムのトランザクション状態およびすべての非同期要求/応答および接続ハンドルの状態などがあります。不当な状態遷移が行われようとすると、呼び出された関数は異常終了し、TPSTATUS-REC
に TPEPROTO()
が設定されます。この情報に関する正規の状態と遷移について、次の表に示します。
この表は、要求/応答型サーバ、会話サーバ、およびクライアントがどの関数を呼び出すことができるかを示しています。ただし、TPSVRINIT()
と TPSVRDONE()
はこの表には示してありません。これらの関数はアプリケーションからは呼び出されないためです。これらはアプリケーションが提供する関数ですが、Oracle Tuxedo システムによって呼び出されます。
以下に示す表は、特に明記されていないかぎり、クライアントとサーバ両方に適用されます。なお、関数によってはクライアントとサーバの両方が呼び出せるわけではないので (たとえば TPINITIALIZE()
)、以下の状態遷移のなかには、両方のプログラム タイプには適用できないものもあります。上記の表を参照して、目的のプログラムから特定の関数を呼び出すことができるかどうかを判断するようにしてください。
次の表は、クライアント プログラムがトランザクション マネージャで初期化され登録されているかどうかを示しています。この表では、TPINITIALIZE()
を使用しているものとします。TPINITIALIZE() は、シングルコンテキスト モードでは任意選択可能です。つまり、シングルコンテキストのクライアントは、多数の ATMI 関数のどれか (たとえば、TPACALL()
または TPCALL()
) を発行することによって、暗黙的にアプリケーションに参加することができます。次のいずれかに該当する場合、クライアントは TPINITIALIZE()
を使用する必要があります。
TPINITIALIZE()
および「UBBCONFIG(5)」の SECURITY
キーワードの説明を参照)TPINITIALIZE(3cbl)
」を参照)
サーバは TPSVRINIT()
関数が呼び出される前に Oracle Tuxedo ディスパッチャによって初期化状態になり、TPSVRDONE()
関数が返された後、Oracle Tuxedo ディスパッチャによって非初期化状態になります。なお、下記のすべての表において、関数がエラーを起こした場合、特に明記されていないかぎり、プログラムの状態は変わりません。
以降の表は、(TPINITIALIZE()
、TPSETCTXT()
、または Oracle Tuxedo のサービス ディスパッチャを介してこの状態でプログラムが到着したかどうかに関わりなく) 事前条件として状態が I1 であると想定しています。
次の表は、クライアントまたサーバに対応するリソース マネージャが初期化されているかいないかに応じてクライアントまたはサーバの状態を示しています。
次の表は、プログラムがトランザクョンに対応しているかどうかに関してそのプログラムの状態を示したものです。サーバの場合、状態 T1 と T2 への遷移は、事前条件として状態 R1 を想定しています (たとえば、TPOPEN()
はそれ以降 TPCLOSE()
または TPTERM()
への呼び出しがないものとして呼び出されています)。
次の表は、TPACALL()
が返す 1 つの要求ハンドルの状態を示すものです。
注意 : | a この状態遷移は、記述子が呼び出し側のトランザクションに関連しない場合にのみ起こります。 |
注意 : | b この状態遷移は、記述子が呼び出し側のトランザクションに関連する場合にのみ起こります。 |
注意 : | c 記述子が呼び出し側のトランザクションに関連する場合、TPSUSPEND() はプロトコル エラーを返します。 |
次の表は、TPCONNECT()
によって返される接続記述子または TPSVCINFO
構造体でサービス呼び出しを行うことによって提供される接続記述子の状態を示したものです。接続記述子をとらないプリミティブの場合、特に明記されていないかぎり、状態の変化はすべての接続記述子に適用されます。
C0 - ハンドルなし
C1 - TPCONNECT ハンドル送信専用
C2 - TPCONNECT ハンドル受信専用
C3 - TPSVCDEF ハンドル送信専用
C4 - TPSVCDEF ハンドル受信専用
注意 : | a プログラムがトランザクション モードで TPNOTRAN の指定がない場合、接続はトランザクション モードになります。 |
注意 : | b TPTRAN が設定されている場合、接続はトランザクション モードになります。 |
注意 : | c 接続がトランザクション モードにない場合、状態は変化しません。 |
注意 : | d 接続がトランザクション モードの場合、TPSUSPEND() はプロトコル エラーを返します。 |
Oracle Tuxedo では、プロセスが必ず TX 関数を正しい順序で呼び出すことを確認します。不正の状態遷移が試行される (つまり、ブランクの遷移エントリの状態から呼び出しを行う) と、呼び出された関数は、TX_PROTOCOL_ERROR
を返します。TX 関数の正当な状態および遷移を、次の表に示します。異常終了を返す呼び出しの場合、この表で特に明記されていないかぎり、状態遷移は行われません。Oracle Tuxedo のクライアントまたはサーバは、TX 関数を使用できます。
TX_SET1
は、TX_OK
、TX_ROLLBACK
、TX_MIXED
、TX_HAZARD
、TX_COMMITTED
のいずれかを表す。TX_ROLLBACK
は tx_rollback()
からは返されず、TX_COMMITTED
は tx_commit()
からは返されない。TX_SET2
は、TX_NO_BEGIN
、TX_ROLLBACK_NO_BEGIN
、TX_MIXED_NO_BEGIN
、TX_HAZARD_NO_BEGIN
、または TX_COMMITTED_NO_BEGIN
のいずれかを表す。TX_ROLLBACK_NO_BEGIN
は tx_rollback()
からは返されず、TX_COMMITTED_NO_BEGIN
は tx_commit()
からは返されない。TX_FAIL
は、いずれかの呼び出しから返された場合には、アプリケーション プログラムの状態は、上記の表では未定義の状態になる。tx_info()
がトランザクション状態情報に TX_ROLLBACK_ONLY
または TX_TIMEOUT_ROLLBACK_ONLY
を返した場合、トランザクションは「ロールバックのみ」とマークされ、アプリケーション プログラムが tx_commit()
と tx_rollback()
のどちらを呼び出したかに関係なく、ロールバックされる。
buffer(3c)、TPINITIALIZE(3cbl)
、TPADVERTISE(3cbl)
、TPBEGIN(3cbl)
,
TPCALL(3cbl)
、TPCONNECT(3cbl)
、TPGETCTXT(3cbl)
、TPKEYCLOSE(3cbl)
、TPKEYGETINFO(3cbl)
、TPKEYOPEN(3cbl)
、TPKEYSETINFO(3cbl)
、TPOPEN(3cbl)
、TPSETCTXT(3cbl)
、TPSVCSTART(3cbl)
、tuxtypes(5)、typesw(5)
FINIT()
、FINIT32()
- フィールド化バッファの初期化
01
FML-BUFFER
.
05 FML-ALIGN
PIC S9(9) USAGE IS COMP.
05 FML-DATA
PIC X(
applen
).
01 FML-REC
COPY FMLINFO.
CALL "FINIT" USING FML-BUFFER
FML-REC
.
CALL "FINIT32" USING FML-BUFFER
FML-REC
.
FINIT()
は、フィールド化バッファの初期化をする場合に呼び出すことができます。FML-BUFFER
は、フィールド化バッファとして使用するレコードであり、FML16 および FML32 と合わせて使用するためには、4 バイトの境界にアライメントされている必要があります。これは、上の「形式」に示すようにレコードの要素を 2 つ定義することで可能になります。FML-REC
中の FML-LENGTH
はレコードの長さです。フィールド化バッファに対応して、内部構造体がフィールドなしで設定されます。アプリケーション プログラムはレコードを FINIT()
、FVFTOS()
、または FVSTOF()
に渡したり、型付きレコードが必要な ATMI 呼び出しに渡す (この場合、タイプは「FML」でサブタイプはありません) 場合を除いて、レコードを解釈してはなりません。
FINIT32()
は 32 ビット FML で使用します。
FINIT()
は正常終了時には、FML-REC
内の FML-STATUS
に FOK
を設定します。
エラーが発生した場合は、FML-STATUS
は 0 以外の値に設定されます。
次の条件が発生すると、FINIT()
は異常終了し、FML-REC
内の FML-STATUS
に次の値を設定します。
[FALIGNERR
]
FNOSPACE
]
バッファからフィールドを削除する再初期化のための正しい方法を以下に示します。Finit
(frfr
, (FLDLEN
)Fsizeof
(fbfr
));
『Oracle Tuxedo FML リファレンス』の「FML 関数の紹介」
FVFTOS()
、FVFTOS32()
- フィールド化バッファから COBOL 構造体にコピーする
01 DATA-REC.
COPY User data.
01 FML-BUFFER.
05 FML-ALIGN PIC S9(9) USAGE IS COMP.
05 FML-DATA PIC X(applen).
01 FML-REC COPY FMLINFO.
CALL "FVFTOS" USING FML-BUFFER DATA-REC FML-REC.
CALL "FVFTOS32" USING FML-BUFFER DATA-REC FML-REC.
FVFTOS()
関数はフィールド化バッファから COBOL のレコードにデータを転送します。FML-BUFFER
は、FINIT()
で初期化されたフィールド化バッファを指すポインタです。DATA-REC
は、C の構造体へのポインタです。FML-REC
中の VIEWNAME
は、COBOL のレコードを記述する VIEW の名前です。
各フィールドは、フィールド化バッファから、VIEWNAME
での要素の記述に基づいた構造体にコピーされます。フィールド化バッファのフィールドに対応する要素が COBOL のレコードに存在しない場合は、そのフィールドは無視されます。COBOL のレコードで指定された要素に対応するフィールドがフィールド化バッファに存在しない場合は、その要素には NULL 値がコピーされます。使用する NULL の値は、各要素ごとに VIEW 記述で定義できます。
複数のオカレンスを COBOL のレコードに格納するには、レコードの要素を OCCURS
で定義してください。バッファ中のフィールドのオカレンスが、要素のオカレンスよりも少ない場合は、余分な要素スロットには NULL 値が代入されます。反対に、バッファ中のフィールドのオカレンスが、要素のオカレンスよりも多い場合は、余分なオカレンスは無視されます。
FVFTOS32()
は、より多くのフィールドを持つ大きな view 用の view32()
型付きバッファで定義された view のために使用されます。
FVFTOS32()
は正常終了時には、FML-REC
内の FML-STATUS
に FOK
を設定します。
エラーが発生した場合は、FML-STATUS
は 0 以外の値に設定されます。
次の条件が発生すると、FVFTOS()
は異常終了し、FML-STATUS
に次の値を設定します。
FALIGNERR
]
FNOTFLD
]
FEINVAL
]
FBADACM
]
FBADVIEW
]
『Oracle Tuxedo FML リファレンス』の「FML 関数の紹介」、viewfile(5)
FVSTOF()
- C 構造体からフィールド化バッファにコピーする
01 DATA-REC.
COPY User data.
01 FML-BUFFER.
05 FML-ALIGN PIC S9(9) USAGE IS COMP.
05 FML-DATA PIC X(applen).
01 FML-REC
COPY FMLINFO.
CALL "FVSTOF" USING FML-BUFFER DATA-REC FML-REC.
CALL "FVSTOF32" USING FML-BUFFER DATA-REC FML-REC.
FVSTOF()
は COBOL のレコードからフィールド化バッファにデータを転送します。FML-BUFFER
は、フィールド化バッファを含むレコードです。DATA-REC
は、COBOL のレコードです。FML-REC
中の VIEWNAME
は、COBOL のレコードを記述する VIEW の名前です。FML-REC
中の FML-MODE
には、データを転送する方式を指定します。FML-MODE
には次の 4 種類の値のいずれかを設定できます。
FUPDATE
FOJOIN
FJOIN
FCONCAT
これらのモードの動作は、Fupdate、Fupdate32(3fml)、Fojoin、Fojoin32(3fml)、Fjoin、Fjoin32(3fml)、および Fconcat、Fconcat32(3fml) で説明したものと同じです。これらの関数ではソース バッファを指定するのに対して、FVSTOF()
では COBOL のレコードを指定することを除けば、FVSTOF()
はこれらの関数と同じものと考えることもできます。FUPDATE
は NULL の値を持つレコードの要素を移動しないことを憶えていてください。
FVSTOF32()
は、より多くのフィールドを持つ大きな view 用の view32()
型付きバッファで定義された view のために使用されます。
FVSTOF32()
は正常終了時には、FML-REC
内の FML-STATUS
に FOK
を設定します。
エラーが発生した場合は、FML-STATUS
は 0 以外の値に設定されます。
次の条件が発生すると、FVSTOF()
は異常終了し、FML-STATUS
に次の値を設定します。
FALIGNERR
]
FNOTFLD
]
FEINVAL
]
FBADACM
]
FBADVIEW
]
『Oracle Tuxedo FML リファレンス』の「FML 関数の紹介」、viewfile(5)
TPABORT()
- 現在の Oracle Tuxedo ATMI のトランザクションのアボート
01
TPTRXDEF-REC
.
COPY TPTRXDEF.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPABORT" USINGTPTRXDEF-REC
TPSTATUS-REC
.
TPABORT()
は、トランザクションの中途終了を指定します。この関数が終了すると、そのトランザクションでなされたリソースへの変更内容はすべて取り消されます。TPCOMMIT()
と同様、このルーチンはトランザクションの実行元しか呼び出せません。参加リソース (サービス ルーチン) は、トランザクションをアボートさせたい場合、TPFAIL()
を設定して TPRETURN()
を呼び出します。
未処理の応答に対する通信ハンドルが存在するときに TPABORT()
を呼び出すと、このルーチンの終了時にトランザクションはアボートし、呼び出し側のトランザクションに関連する通信ハンドルは以後無効になります。呼び出し側のトランザクションと無関係の通信ハンドルは有効なままです。
トランザクション モードの会話サーバに対してオープン接続がある場合、TPABORT()
は TPEV-DISCONIMM
イベントをサーバに送ります (そのサーバが接続の制御権を有するかどうかに関係なく)。TPBEGIN()
の前に、あるいは TPNOTRAN
設定を付けて (つまり、トランザクション モードにない状態で) オープンした接続は、影響を受けません。
現時点では、TPABORT()
の引数 TPTRXDEF-REC
は将来使用するために予約されています。
TPABORT()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。
次の条件が発生すると、TPABORT()
は異常終了し、TP-STATUS
に次の値を設定します。
TPEINVAL
]
TPEHEURISTIC
]
TPEHAZARD
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPBEGIN()
、TPCOMMIT()
および TPABORT()
を使用して Oracle Tuxedo ATMI のトランザクションを記述する際には、XA インタフェースに準拠した (および呼び出し側に適切にリンクされている) リソース マネージャの行う作業がトランザクションとしての特性を備えていることを忘れないようにすることが重要です。トランザクションで行われるその他の処理内容は、TPCOMMIT()
や TPABORT
の影響を受けません。
TPBEGIN(3cbl)
、TPCOMMIT(3cbl)
、TPGETLEV(3cbl)
TPACALL()
- サービスへのメッセージの非同期送信を行うルーチン
01
TPSVCDEF-REC
.
COPY TPSVCDEF.
01TPTYPE-REC
.
COPY TPTYPE.
01DATA-REC
.
COPY User data.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPACALL" USINGTPSVCDEF-REC
TPTYPE-REC
DATA-REC
TPSTATUS-REC
.
TPACALL()
は、TPSVCDEF-REC
内の SERVICE-NAME
で指定されているサービスに要求メッセージを送ります。この要求は、以前になされた TPSPRIO()
の呼び出しで変更されていないかぎり、SERVICE-NAME
に定義されている優先順位で送信されます。DATA-REC
は、送信するメッセージであり、TPTYPE-REC
内の LEN
は、DATA-REC
に入るデータの大きさを指定します。ただし、DATA-REC
が長さの指定を必要としないタイプのレコードである場合 LEN
は無視されます (0
でかまいません)。TPTYPE-REC
内の REC-TYPE
が SPACES
の場合は、DATA-REC
および LEN
は無視され、要求はデータ部なしで送信されます。REC-TYPE
が STRING
で、LEN
が 0
の場合は、要求はデータ部なしで送信されます。DATA-REC
の REC-TYPE
および SUB-TYPE
は、SERVICE-NAME
が認識する REC-TYPE
および SUB-TYPE
のいずれかと一致しなければなりません。トランザクション モードにあるときに送信される要求ごとに、最終的には対応する応答が受信されなければならないことに注意してください。
次に、TPSVCDEF-REC
の有効な設定の一覧を示します。
TPNOTRAN
SERVICE-NAME
が呼び出されても、呼び出し側のトランザクションの一部として実行されません。トランザクションをサポートしないサーバに SERVICE-NAME
が属しており、呼び出し側がトランザクション モードにある場合は、この設定を指定しなければなりません。このフラグ設定を使用するトランザクション モードの呼び出し側は、依然としてトランザクション タイムアウトの対象となります (それ以外はなし)。この設定を使用した状態で呼び出されたサービスが正常に実行できない場合、呼び出し側のトランザクションは影響を受けません。TPNOTRAN
または TPTRAN
のいずれかが設定されていなければなりません。
TPTRAN
SERVICE-NAME
が呼び出されたときに、このプログラムは呼び出し側のトランザクションのために実行されます。呼び出し側がトランザクション モードにない場合、この設定は無視されます。TPNOTRAN
または TPTRAN
のいずれかが設定されていなければなりません。
TPNOREPLY
tpacall()
に通知します。TPNOREPLY
が設定されると、このルーチンは、正常終了時には [TPOK
] を返し、TPSVCDEF-REC
内の COMM-HANDLE
に 0
を設定します。0 は、無効な通信ハンドルです。呼び出し側がトランザクション モードにある場合は、TPTRAN
も設定するときには、この設定は使用できません。TPNOREPLY
または TPREPLY
のいずれかが設定されていなければなりません。
TPREPLY
TPACALL()
に通知します。TPREPLY
が設定されると、このルーチンは、正常終了時には [TPOK
] を返し、COMM-HANDLE
に有効な通信ハンドルを設定します。呼び出し側がトランザクション モードにあり、TPTRAN
がセットされている場合は、このフラグを設定する必要があります。TPNOREPLY
または TPREPLY
のいずれかが設定されていなければなりません。
TPNOBLOCK
TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPBLOCK
TPBLOCK
がセットされ、ブロッキング条件が存在する場合は、呼び出し側はブロッキング条件が消失するか、またはタイムアウト (トランザクション タイムアウト、またはブロッキング タイムアウト) が発生するまでブロックします。TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPNOTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPSIGRSTRT
TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
TPNOSIGRSTRT
TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
TPACALL()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。また、TPSVCDEF-REC
に TPREPLY
が設定されている場合には、TPACALL()
は、COMM-HANDLE
に通信ハンドルを返します。このハンドルは、送信した要求に対する応答を受信する際に使用できる有効なハンドルです。
次の条件が発生すると、TPACALL()
は異常終了し、TP-STATUS
に次の値を設定します。特に説明がなければ、この障害は呼び出し側のトランザクションには影響しません。
TPEINVAL
]
TPENOENT
]
TPEITYPE
]
TPELIMIT
]
TPETRAN
]
TPETIME
]
TPBLOCK
と TPTIME
の両方が指定された場合にのみ発生します。
TPETIME
が発生します。ただし、例外が 1 つあります。例外は、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションのために送信されない要求 (つまり、TPNOTRAN
、TPNOBLOCK
、および TPNOREPLY
が設定された状態で TPACALL()
が呼び出される場合) です。
TX_ROLLBACK_ONLY
状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME
で異常終了します (前の段落で説明した例外を除く)。
TPEBLOCK
]
TPGOTSIG
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPCALL(3cbl)
、TPCANCEL(3cbl)
、TPGETRPLY(3cbl)
、TPGPRIO(3cbl)
、TPSPRIO(3cbl)
TPADVERTISE()
- サービス名の宣言を行うルーチン
01
SVC-NAME
PIC X(15).
01 PROGRAM-NAME
PIC X(32).
01 TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPADVERTISE" USING SVC-NAME
PROGRAM-NAME
TPSTATUS-REC
.
TPADVERTISE()
は、サーバが提供するサービスを宣言するときに使用します。デフォルトの設定では、サーバのサービスは、サーバのブート時に宣言され、サーバの停止時にその宣言が解除されます。
複数サーバ単一キュー (MSSQ) セットに属するすべてのサーバは、同じサービス セットを提供しなければなりません。これらのルーチンは、MSSQ セットを共有する全サーバを宣言することによってこの規則を適用します。
TPADVERTISE()
は、サーバ (または、呼び出し側の MSSQ セットを共有するサーバ セット) の SVC-NAME
を宣言します。SVC-NAME
の長さは 15 文字以内にしてください。これに、SPACES
を指定することはできません (UBBCONFIG(5) の SERVICES
セクションを参照)。これより長い名前は、15 文字までで切り捨てられてしまいます。このため、切り捨てられた名前が他のサービス名と同じにならないよう、注意が必要です。PROGRAM-NAME
は Oracle Tuxedo ATMI のサービス プログラムの名前です。このプログラムは、SVC-NAME
に対する要求をサーバが受け取ったときに起動されます。PROGRAM-NAME
に SPACES
を指定することはできません。
SVC-NAME
が既にサーバに対して宣言されていて、PROGRAM-NAME
がその現在のプログラムと一致する場合 (既に宣言されていた名前と切り捨てられた名前が一致する場合を含む)、TPADVERTISE()
は正常終了します。ただし、SVC-NAME
がすでにサーバに対して宣言されていても、PROGRAM-NAME
が現在のプログラムと一致しない場合には (すでに宣言されていた名前と切り捨てられた名前が一致する場合も含む)、エラーが返されます。
TPADVERTISE()
TPADVERTISE()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。
次の条件が発生すると、TPADVERTISE()
は異常終了し、TP-STATUS
に次の値を設定します。
TPEINVAL
]
TPELIMIT
]
TPEMATCH
]
SVC-NAME
がサーバに対してすでに宣言されているが、PROGRAM-NAME
以外のプログラムで宣言されている場合。TPADVERTISE()
が異常終了しても、SVC-NAME
はその現在のプログラムで宣言されたまま変わりません。つまり、現在のプログラムは PROGRAM-NAME
に置き換えられません。
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
RS6000 上の AIX では、最初の COBOL オブジェクト ファイルで提供されるどのサービスもシンボル テーブルで利用できません。buildserver
コマンドで -s
オプションを指定してサービス名を特定し、サービス名が TPADVERTISE()
により実行時に宣言されるようにする必要があります。
TPBEGIN()
- Oracle Tuxedo ATMI のトランザクションを開始するルーチン
01
TPTRXDEF-REC
.
COPY TPTRXDEF.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPBEGIN" USINGTPTRXDEF-REC
TPSTATUS-REC
.
Oracle Tuxedo システムにおけるトランザクションは、完全に成功するか、あるいは何も影響を残さない 1 つの論理的な作業単位の定義として使用されます。トランザクションにより、多くのプロセスで (そして、多分様々なサイトで) 行われる作業を 1 つの分割できない単位として扱うことができます。トランザクションの開始プロセスは、TPBEGIN()
と TPCOMMIT()
または TPABORT()
を使用して、トランザクション内の処理を記述します。TPBEGIN()
が呼び出された後は、ほかのプログラムとの通信は、後のプログラム (つまり、サーバ) を「トランザクション モード」にすることが可能です。つまり、サーバの作業はトランザクションの一部になります。トランザクションに参加した制御のスレッドを参加リソースと呼びます。トランザクションには、必ず 1 つの実行元があり、いくつかの参加リソースをもつことができます。TPCOMMIT()
または TPABORT()
を呼び出せるのは、トランザクションの実行元だけです。参加リソースは、それらが TPRETURN()
を呼び出したときに、TPSVCDEF-REC
の設定によってトランザクションの結果に影響することがあります。トランザクション モードに入ると、サーバに出されたサービス要求はすべて、トランザクションの一部として処理されます (明示的にリクエスタからのそれ以外の指定がない場合)。
また、会話型サーバに対して確立されたオープン接続があるときにプログラムがトランザクションを起動しても、これらの接続はトランザクション モードには変わりません。これは、TPCONNECT()
の呼び出し時に TPNOTRAN
設定を指定したことと同じです。
T-OUT
は、トランザクションのタイムアウトまでの時間を最低 T-OUT
秒にすることを指定します。トランザクションはタイムアウト時間を経過した後は、中途終了しなければなりません。T-OUT
の値が 0
であると、トランザクションにはシステムが許す最大時間 (秒単位) のタイムアウト値が与えられます。つまり、このときのタイムアウト値は、システムが定義する符号なし long 型の最大値になります。
TPBEGIN()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。
次の条件が発生すると、TPBEGIN()
は異常終了し、TP-STATUS
に次の値を設定します。
TPEINVAL
]
TPETRAN
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPBEGIN()
、TPCOMMIT()
、および TPABORT()
を使用して Oracle Tuxedo ATMI のトランザクションを記述する際には、XA インタフェースに準拠した (および呼び出し側に適切にリンクされている) リソース マネージャが行う作業がトランザクションとしての特性を備えていることを覚えておくことが重要です。トランザクションで行われるその他の処理内容は、TPCOMMIT()
や TPABORT()
の影響を受けません。そのリソース マネージャが行った処理が Oracle Tuxedo ATMI のトランザクションの一部となるよう、XA インタフェースを満たすリソース マネージャをサーバにリンクする方法については、「buildserver(1)」を参照してください。
TPABORT(3cbl)
、TPCOMMIT(3cbl)
、TPGETLEV(3cbl)
、TPSCMT(3cbl)
TPBROADCAST()
- 名前によって通知をブロードキャストする
01
TPBCTDEF-REC
.
COPY TPBCTDEF.
01TPTYPE-REC
.
COPY TPTYPE.
01DATA-REC
.
COPY User data.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPBROADCAST" USINGTPBCTDEF-REC
TPTYPE-REC
DATA-REC
TPSTATUS-REC
.
tpbroadcast()
は、クライアント プロセスやサーバ プロセスがシステム内に登録されているクライアントに非請求メッセージを送ることができるようにします。ターゲット クライアント セットは、tpbroadcast()
に渡されるワイルドカード以外の識別子すべてと一致するクライアントで構成されます。識別子の指定にワイルドカードを使用できます。
LMID
、USRNAME
および CLTNAME
は、すべて TPBCTDEF-REC
に入り、ターゲット クライアント セットの選択に使用する論理識別子です。論理識別子の SPACES
値は、その引数のワイルドカードとなります。ワイルドカード引数は、そのフィールドの全クライアント識別子と一致します。各識別子は、システムが有効とみなすよう定義されたサイズの制約事項を満たさなければなりません。つまり、各識別子の長さは 0 から 30 文字まででなければなりません。
要求のデータ部は、DATA-REC
によって識別され、TPTYPE-REC
内の LEN
は、送信する DATA-REC
の大きさを指定します。ただし、DATA-REC
が長さの指定を必要としないタイプのレコードである場合 LEN
は無視されます (0
でかまいません)。TPTYPE-REC
内の REC-TYPE
が SPACES
の場合、DATA-REC
および LEN
は無視され、データ部なしで要求が送られます。
次に、TPBCTDEF-REC
の有効な設定の一覧を示します。
TPNOBLOCK
TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPBLOCK
TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPNOTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPSIGRSTRT
tpbroadcast()
が正常終了した場合には、メッセージはシステムに渡され、選択されたクライアントに転送されます。tpbroadcast()
は、選択された各クライアントにメッセージが送られるのを待機しません。TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
TPNOSIGRSTRT
TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
TPBROADCAST()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。
次の条件が発生すると、TPBROADCAST()
はブロードキャスト メッセージをアプリケーション クライアントに送信せず、TP-STATUS
に次の値を設定します。
TPEINVAL
]
LMID
を使用すると、TPBROADCAST()
は異常終了し、TPEINVAL()
が返されます。ただし、存在しないユーザやクライアントの名前の場合は、どこにもブロードキャストされないだけでこのルーチンは正常に終了します。
TPETIME
]
TPEBLOCK
]
TPGOTSIG
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPNOTIFY()
に記述されているインタフェースはすべて、ネイティブ サイトの UNIX システムベースのプロセッサ上で利用できます。さらに、ルーチン TPBROADCAST()
と TPCHKUNSOL()
およびルーチン TPSETUNSOL()
は、UNIX および MS-DOS ワークステーション プロセッサ上で利用できます。
シグナル ベースの通知方法を選択したクライアントは、シグナルに関する制約から、システムがシグナルで通知を制御することはできません。このような状態で通知がなされた場合、システムは、選択されたクライアントに対する通知方法をディップ インに切り替えることを示すログ メッセージを生成し、以後、クライアントにはディップ イン方式で通知が行われることになります (通知方法の詳細については、「UBBCONFIG(5)」の中の RESOURCES
セクションの NOTIFY
パラメータの説明を参照してください)。
クライアントのシグナル通知は、常にシステムによって行われるので、元の通知呼び出しがどこで行われるかにかかわらず、通知の形態は一貫しています。したがって、シグナル ベースの通知を使用するには次の条件が必要です。
アプリケーション管理者の ID は、そのアプリケーションのコンフィグレーション ファイルで識別されます。
あるクライアントに対してシグナル ベースの通知方法を選択すると、いくつかの ATMI 呼び出しは異常終了します。TPSIGRSTRT
の指定がなければ、非請求メッセージを受け取るため、TPGOTSIG()
を返します。通知方法の選択については、「UBBCONFIG(5)」および「TPINITIALIZE(3cbl)
」を参照してください。
TPINITIALIZE(3cbl)
、TPNOTIFY(3cbl)
、TPTERM(3cbl)
、UBBCONFIG(5)
TPCALL()
- サービスへのメッセージの同期送信を行うルーチン
01
TPSVCDEF-REC
.
COPY TPSVCDEF.
01ITPTYPE-REC
.
COPY TPTYPE.
01IDATA-REC
.
COPY User data.
01OTPTYPE-REC
.
COPY TPTYPE.
01ODATA-REC
.
COPY User data.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPCALL" USINGTPSVCDEF-REC
ITPTYPE-REC
IDATA-REC
OTPTYPE-REC
ODATA-REC
TPSTATUS-REC
.
TPCALL()
は要求を送り、それと同期してその応答を待ちます。このルーチンへの呼び出しは、TPACALL()
を呼び出した後即座に TPGETRPLY()
を呼び出すのと同じことです。TPCALL()
は、TPSVCDEF-REC
内の SERVICE-NAME
で指定する要求/応答型サービスに要求を送ります。この要求は、以前になされた TPSPRIO()
の呼び出しで変更されていないかぎり、SERVICE-NAME
に定義されている優先順位で送信されます。要求のデータ部分は、IDATA-REC
によって指定され、ITPTYPE-REC
内の LEN
は、送信する IDATA-REC
の大きさを指定します。なお、IDATA-REC
は、長さの指定を必要としないタイプのレコードを指している場合、ITPTYPE-REC
内の LEN
は無視されます (0
でかまいません)。ITPTYPE-REC
内の REC-TYPE
が SPACES
の場合には、IDATA-REC
および ITPTYPE-REC
内の LEN
は無視され、データ部なしで要求が送信されます。ITPTYPE-REC
内の REC-TYPE
が STRING
のときに ITPTYPE-REC
内の LEN
が 0
の場合にも、データ部なしで要求が送信されます。ITPTYPE-REC
内の REC-TYPE
および ITPTYPE-REC
内の SUB-TYPE
は、SERVICE-NAME
が認識する REC-TYPE
および SUB-TYPE
のいずれかと一致しなければなりません。
ODATA-REC
は応答が読み込まれる場所を指定し、入力時の OTPTYPE-REC
内の LEN
は ODATA-REC
に移動されるべき最大バイト数を示します。同じレコードを送信と受信の両方に使用する場合には、ODATA-REC
を IDATA-REC
に REDEFINED
してください。TPCALL()
の正常終了時には、OTPTYPE-REC
内の LEN
には、ODATA-REC
に実際に移動されたバイト数が入ります。OTPTYPE-REC
内の REC-TYPE
および SUB-TYPE
には、それぞれ応答のタイプおよびサブタイプが入っています。応答が ODATA-REC
より大きい場合は、ODATA-REC
にはこのレコードに入るバイト数分のみが入ります。応答の残りは破棄され、TPCALL()
は TPTRUNCATE()
を設定します。
OTPTYPE-REC
内の LEN
が正常終了時に 0
であると、応答にはデータ部がなく、ODATA-REC
は変更されていません。OTPTYPE-REC
内の LEN
が入力時に 0
であると、エラーになります。
次に、TPSVCDEF-REC
の有効な設定の一覧を示します。
TPNOTRAN
SERVICE-NAME
が呼び出されても、呼び出し側のトランザクションの一部として実行されません。トランザクションをサポートしないサーバに SERVICE-NAME
が属しており、呼び出し側がトランザクション モードにある場合は、この設定を指定しなければなりません。この値を真に設定する、トランザクション モードの呼び出し側は、やはりトランザクション タイムアウトの影響を受けます (それ以外はなし)。
この設定を使用した状態で呼び出されたサービスが正常に実行できない場合、呼び出し側のトランザクションは影響を受けません。TPNOTRAN
または TPTRAN
のいずれかが設定されていなければなりません。
TPTRAN
SERVICE-NAME
が呼び出されたときに、このプログラムは呼び出し側のトランザクションのために実行されます。呼び出し側がトランザクション モードにない場合は、この設定は無視されます。TPNOTRAN
または TPTRAN
のいずれかが設定されていなければなりません。
TPNOCHANGE
ODATA-REC
のタイプは変更されません。つまり、応答されたレコードのタイプとサブタイプは、受け取り側が着信レコードのタイプを識別するかぎりは、それぞれ OTPTYPE-REC
内の REC-TYPE
および OTPTYPE-REC
内の SUB-TYPE
と一致しなければなりません。TPNOCHANGE
または TPCHANGE
のいずれかが設定されていなければなりません。
TPCHANGE
OTPTYPE-REC
内の REC-TYPE
および OTPTYPE-REC
内の SUB-TYPE
と異なっていることが可能です。TPNOCHANGE
または TPCHANGE
のいずれかが設定されていなければなりません。
TPNOBLOCK
TPCALL()
の送信部分にしか適用されません。このルーチンは応答を待ってブロックすることがあります。TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPBLOCK
TPBLOCK
がセットされ、ブロッキング条件が存在する場合は、呼び出し側はブロッキング条件が消失するか、またはタイムアウト (トランザクション タイムアウト、またはブロッキング タイムアウト) が発生するまでブロックします。TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPNOTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPSIGRSTRT
TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
TPNOSIGRSTRT
TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
TPCALL()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。TP-STATUS
に TPOK
または TPESVCFAIL
が設定されると、TPSTATUS-REC
内の APPL-RETURN-CODE
に TPRETURN()
の一部として送信されたアプリケーション定義の値が入ります。
着信メッセージの大きさが入力時に LEN
に指定されたものより大きい場合は、TPTRUNCATE()
が設定され、LEN
分のデータのみが ODATA-REC
に移動されて残りのデータは破棄されます。
次の条件が発生すると、TPCALL()
は異常終了し、TP-STATUS
に次の値を設定します。特に説明がなければ、この障害は呼び出し側のトランザクションには影響しません。
TPEINVAL
]
TPENOENT
]
TPEITYPE
]
TPEOTYPE
]
TPNOCHANGE
が設定されていて、ODATA-REC
の REC-TYPE
と SUB-TYPE
が、そのサービスから送られた応答のタイプおよびサブタイプと一致しません。ODATA-REC
および OTPTYPE-REC
内の LEN
はいずれも変更されません。サービス要求が呼び出し側の現在のトランザクションの一部として発行されると、応答が破棄されるので、そのトランザクションに中途終了マークが付けられます。
TPETRAN
]
TPETIME
]
TPBLOCK
と TPTIME
の両方が指定された場合にのみ発生します。いずれの場合でも、ODATA-REC
も OTPTYPE-REC
も変更されません。
TPETIME
が発生します。ただし、例外が 1 つあります。例外は、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションのために送信されない要求 (つまり、TPNOTRAN
、TPNOBLOCK
、および TPNOREPLY
が設定された状態で TPACALL()
が呼び出される場合) です。
TX_ROLLBACK_ONLY
状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME
で異常終了します (前の段落で説明した例外を除く)。
TPESVCFAIL
]
TPFAIL()
を設定して TPRETURN()
を呼び出しました。これは、アプリケーション レベルの障害です。サービスの応答の内容 (送信された場合) は、ODATA-REC
に入ります。呼び出し側のトランザクションの一部としてサービス要求が出された場合、トランザクションには中途終了マークが付けられます。トランザクションがタイムアウトになったかどうかにかかわらず、トランザクションがアボートされる前に有効な通信は、TPNOREPLY
、TPNOTRAN
、および TPNOBLOCK
を設定した TPACALL()
の呼び出しのみです。
TPESVCERR
]
TPRETURN()
で完了する際に、エラーを検出しました (たとえば、間違った引数が渡された場合など)。このエラーが発生すると、応答データは返されません。つまり、ODATA-REC
も OTPTYPE-REC
も変更されません。呼び出し側のトランザクションの一部としてサービス要求が出された場合 (つまり、TPNOTRAN
が設定されていない場合)、このトランザクションは中途終了マークが付けられます。トランザクションがタイムアウトになったかどうかにかかわらず、トランザクションがアボートされる前に有効な通信は、TPNOREPLY
、TPNOTRAN
、および TPNOBLOCK
を設定した TPACALL()
の呼び出しのみです。
TPEBLOCK
]
TPGOTSIG
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPACALL(3cbl)
、TPFORWAR(3cbl)
、TPGPRIO(3cbl)
、TPRETURN(3cbl)
、TPSPRIO(3cbl)
TPCANCEL()
- 未処理の応答の通信ハンドルを取り消す
01
TPSVCDEF-REC
.
COPY TPSVCDEF.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPCANCEL" USINGTPSVCDEF-REC
TPSTATUS-REC
.
TPCANCEL()
は、TPACALL()
が返す通信ハンドル、TPSVCDEF-REC
内の COMM-HANDLE
を取り消します。トランザクションに対応する通信ハンドルを取り消そうとすると、エラーになります。
正常終了の場合、COMM-HANDLE
は以後無効になり、COMM-HANDLE
のために受信する応答はすべて、警告なしに破棄されます。
TPCANCEL()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。
次の条件が発生すると、TPCANCEL()
は異常終了し、TP-STATUS
に次の値を設定します。
TPEBADDESC
]
TPETRAN
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPCHKAUTH()
- Oracle Tuxedo ATMI アプリケーションへの結合に認証が必要かどうかをチェックする
01
TPAUTDEF-REC
.
COPY TPAUTDEF.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPCHKAUTH" USINGTPAUTDEF-REC
TPSTATUS-REC
.
TPCHKAUTH()
は、アプリケーションのコンフィグレーションが認証を必要としているかどうかを調べます。これは一般に、TPINITIALIZE()
を呼び出す前にアプリケーション クライアントが使用して、ユーザからのパスワードの入力を必要とするかどうかを判別します。
TPCHKAUTH()
は正常終了時には、TP-STATUS
に [TPOK
] を設定し、TPAUTDEF-REC
に次のいずれかの値を設定します。
TPNOAUTH
TPSYSAUTH
TPAPPAUTH
次の条件が発生すると、TPCHKAUTH()
は異常終了し、TP-STATUS
に次の値を設定します。
TPESYSTEM
]
TPEOS
]
TPCHKAUTH()
に記述されているインタフェースは、UNIX システムおよび MS-DOS オペレーティング システム上でサポートされています。
TPCHKUNSOL()
- 非請求メッセージをチェックする
01
MSG-NUM
PIC S9(9) COMP-5.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPCHKUNSOL" USINGMSG-NUM
TPSTATUS-REC
.
tpchkunsol()
は、クライアントが非請求メッセージの検査を行うときに使用します。クライアントでシグナル ベースの通知方法を使用してこのルーチンを呼び出しても、何も行われず、ただちに終了します。このルーチンを呼び出すと、アプリケーションで定義された非請求メッセージ処理ルーチンへの呼び出しが Oracle Tuxedo ATMI のライブラリによって行われることがあります。
TPCHKUNSOL()
は正常終了時には、TP-STATUS
に [TPOK
] を設定し、ディスパッチされた非請求メッセージの数を MSG-NUM
に返します。
次の条件が発生すると、TPCHKUNSOL()
は異常終了し、TP-STATUS
に次の値を設定します。
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPNOTIFY()
に記述されているインタフェースはすべて、ネイティブ サイトの UNIX システムベースのプロセッサ上で利用できます。さらに、ルーチン TPBROADCAST()
と TPCHKUNSOL()
およびルーチン TPSETUNSOL()
は、UNIX および MS-DOS ワークステーション プロセッサ上で利用できます。
シグナル ベースの通知方法を選択したクライアントは、シグナルに関する制約から、システムがシグナルで通知を制御することはできません。このような状態で通知がなされた場合、システムは、選択されたクライアントに対する通知方法をディップ インに切り替えることを示すログ メッセージを生成し、以後、クライアントにはディップ イン方式で通知が行われることになります (通知方法の詳細については、「UBBCONFIG(5)」の中の RESOURCES
セクションの NOTIFY
パラメータの説明を参照してください)。
クライアントのシグナル通知は、常にシステムによって行われるので、元の通知呼び出しがどこで行われるかにかかわらず、通知の形態は一貫しています。したがって、シグナル ベースの通知を使用するには次の条件が必要です。
アプリケーション管理者の ID は、アプリケーション コンフィグレーションの一部として識別されます。
あるクライアントに対してシグナル ベースの通知方法を選択すると、いくつかの ATMI 呼び出しは異常終了します。TPSIGRSTRT
の指定がなければ、非請求メッセージを受け取るため、TPGOTSIG()
を返します。通知方法の選択については、「UBBCONFIG(5)」および「TPINITIALIZE(3cbl)
」を参照してください。
TPBROADCAST(3cbl)
、TPINITIALIZE(3cbl)
、TPNOTIFY(3cbl)
、TPSETUNSOL(3cbl)
TPCLOSE()
- Oracle Tuxedo ATMI のリソース マネージャのクローズ
01
TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPCLOSE" USINGTPSTATUS-REC
.
tpclose()
は、呼び出し側とそれにリンクされたリソース マネージャとの関係を絶ちます。リソース マネージャはクローズの内容がそれぞれで異なるため、個々のリソース マネージャをクローズするために必要な情報をコンフィグレーション ファイルに記述します。
リソース マネージャがすでにクローズしている場合 (つまり、tpclose()
が 1 回以上呼び出された)、何も処理は行われず、正常終了を示すコードが返されます。
TPCLOSE()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。
次の条件が発生すると、TPCLOSE()
は異常終了し、TP-STATUS
に次の値を設定します。
TPERMERR
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPCOMMIT()
- 現在の Oracle Tuxedo ATMI のトランザクションのコミット
01
TPTRXDEF-REC
.
COPY TPTRXDEF.
01 TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPCOMMIT" USING TPTRXDEF-REC
TPSTATUS-REC
tpcommit()
はトランザクションの終了 (コミット) を示します。tpcommit() は 2 フェーズ コミット プロトコルを使用して、参加リソース間の調整をとります。tpcommit()
は、トランザクションの開始プロセスからのみ呼び出されます。いずれかの参加リソースがトランザクションをコミットできない場合 (たとえば、それらが TPFAIL()
を設定して TPRETURN()
を呼び出す場合など)、そのトランザクション全体がアボートされ、TPCOMMIT()
は異常終了します。つまり、そのトランザクションに関連して各プロセスが行ったすべての作業は取り消されます。すべての参加リソースがトランザクションの中のそれぞれが担当する部分のコミットを決定した場合、この決定は安定記憶装置に記録された後、すべての参加リソースに対して作業のコミットが要求されます。
TP-COMMIT-CONTROL
特性の設定条件に従って (TPSCMT()
参照)、コミットの決定が記録された後、あるいは 2 フェーズ コミット プロトコルが完了した後、TPCOMMIT()
は正常に終了することができます。コミットの決定が記録された後、第 2 フェーズが完了する前 (TP-CMT-LOGGED
) に TPCOMMIT()
が終了する場合、すべての参加リソースはトランザクションのために行った作業内容をコミットすることに同意していると見なし、第 2 フェーズでトランザクションをコミットする約束を果たす必要があります。ただし、TPCOMMIT()
は第 2 フェーズが完了する前に終了してしまうので、参加リソースの中には、このルーチンが正常終了した場合でも、トランザクションの担当部分をヒューリスティックに (コミットの決定とは矛盾するような方法で) 完了するといった状況が発生してしまいます。
TP-COMMIT-CONTROL
特性が 2 フェーズ コミット プロトコルの完了 (TP-CMT-COMPLETE
) 後に TPCOMMIT()
が終了するように設定されている場合、その戻り値にはトランザクションの正確な状態が反映されます (つまり、トランザクションがヒューリスティックに完了したかどうか)。
なお、トランザクションに 1 つのリソース マネージャしか関与していない場合には、1 フェーズ コミットが行われます (つまり、リソース マネージャには、コミットできるかどうかの確認はされず、単にコミットの指示が出されます)。そして、この場合、TP-COMMIT-CONTROL
特性はコミットには関係せず、TPCOMMIT()
はヒューリスティックな結果 (もしあれば) を返します。
未処理の応答の通信ハンドルがあるときに TPCOMMIT()
が呼び出されると、TPCOMMIT()
の終了時にトランザクションはアボートし、呼び出し側のトランザクションに対応する通信ハンドルがすべて無効になります。呼び出し側のトランザクションに対応していない通信ハンドルは有効なままです。
呼び出し側のトランザクションに対応する接続がすべてクローズしてから、TPCOMMIT()
を呼び出さなければなりません。そうでないと、[TPEABORT
] が返され、トランザクションはアボートし、TPEV-DISCONIMM
イベントを示して各接続が不規則に切断されます。TPBEGIN()
の前または TPNOTRAN
を設定して (つまり、トランザクション モードでない状態で) オープンされた接続は、TPCOMMIT()
または TPABORT()
の影響を受けません。
現時点では、TPCOMMIT()
の引数 TPTRXDEF-REC
は将来使用するために予約されています。
TPCOMMIT()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。
次の条件が発生すると、TPCOMMT()
は異常終了し、TP-STATUS
に次の値を設定します。
TPEINVAL
]
TPETIME
]
TPEABORT
が返されます。
TPEABORT
]
tpcommit()
が、未終了の応答が残っているか会話型接続をオープンしたまま呼び出された場合にも返されます。
TPEHEURISTIC
]
TPEHAZARD
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPBEGIN()
、TPCOMMIT()
、および TPABORT()
を使用して Oracle Tuxedo ATMI のトランザクションを記述する際には、XA インタフェースに準拠した (および呼び出し側に適切にリンクされている) リソース マネージャが行う作業のみがトランザクションとしての特性を備えていることを忘れないようにすることが重要です。トランザクションで行われるその他の処理内容は、TPCOMMIT()
や TPABORT()
の影響を受けません。そのリソース マネージャが行った処理が Oracle Tuxedo ATMI のトランザクションの一部となるよう、XA インタフェースを満たすリソース マネージャをサーバにリンクする方法については、「buildserver(1)」を参照してください。
TPABORT(3cbl)
、TPBEGIN(3cbl)
、TPCONNECT(3cbl)
、TPGETLEV(3cbl)
、TPRETURN(3cbl)
、TPSCMT(3cbl)
01
TPSVCDEF-REC
.
COPY TPSVCDEF.
01TPTYPE-REC
.
COPY TPTYPE.
01DATA-REC
.
COPY User data.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPCONNECT" USINGTPSVCDEF-REC
TPTYPE-REC
DATA-REC
TPSTATUS-REC
.
TPCONNECT()
により、プログラムは会話サービス、TPSVCDEF-REC
内の SERVICE-NAME
との半二重接続をセットアップできます。この名前は、会話型サーバがポストした会話型サービス名の 1 つでなければなりません。
呼び出し側は、接続セットアップ処理の一部として、アプリケーション定義データを受信サービス ルーチンに渡すことができます。呼び出し側がデータを渡すことを選択した場合には、DATA-REC
にはデータが入り、TPTYPE-REC
内の LEN
は送信するレコードの大きさを指定します。ただし、DATA-REC
が長さの指定を必要としないタイプのレコードである場合 LEN
は無視されます (0
でかまいません)。TPTYPE-REC
内の REC-TYPE
が SPACES
である場合、DATA-REC
および LEN
は無視されます (アプリケーション データは会話サービスに渡されません)。REC-TYPE
および TPTYPE-REC
内の SUB-TYPE
は、SERVICE-NAME
が認識するタイプおよびサブタイプと一致しなければなりません。
TPSVCSTART()
の正常終了時には会話サービスは DATA-REC
および LEN
を受け取るので、TPCONNECT()
が送信したデータを獲得するために、会話サービスが TPRECV()
を呼び出すことはありません。
次に、TPSVCDEF-REC
の有効な設定の一覧を示します。
TPNOTRAN
SERVICE-NAME
が呼び出されても、呼び出し側のトランザクションの一部として実行されません。トランザクションをサポートしないサーバに SERVICE-NAME
が属しており、呼び出し側がトランザクション モードにある場合は、この設定を指定しなければなりません。このフラグ設定を使用するトランザクション モードの呼び出し側は、依然としてトランザクション タイムアウトの対象となります (それ以外はなし)。この設定を使用した状態で呼び出されたサービスが正常に実行できない場合、呼び出し側のトランザクションは影響を受けません。TPNOTRAN
または TPTRAN
のいずれかが設定されていなければなりません。
TPTRAN
SERVICE-NAME
が呼び出されたときに、このプログラムは呼び出し側のトランザクションのために実行されます。呼び出し側がトランザクション モードにない場合、この設定は無視されます。TPNOTRAN
または TPTRAN
のいずれかが設定されていなければなりません。
TPSENDONLY
TPSENDONLY
または TPRECVONLY
のいずれかを指定しなければなりません。
TPRECVONLY
TPSENDONLY
または TPRECVONLY
のいずれかを指定しなければなりません。
TPNOBLOCK
TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPBLOCK
TPBLOCK
がセットされ、ブロッキング条件が存在する場合は、呼び出し側はブロッキング条件が消失するか、またはタイムアウト (トランザクション タイムアウト、またはブロッキング タイムアウト) が発生するまでブロックします。TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPNOTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPSIGRSTRT
TPNOSIGRSTRT
TPNOSIGRSTRT
を指定しているときにシグナルが関数内部のシステム コールを中断させると、その呼び出しは異常終了し、TP-STATUS
に TPGOTSIG()
が設定されます。TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
TPCONNECT()
は正常終了時には、TP-STATUS
に [TPOK
] を設定し、TPSVCDEF-REC
内の COMM-HANDLE
に通信ハンドルを返します。このハンドルは、以降の呼び出しにおいて接続を参照するために使用されます。
次の条件が発生すると、TPCONNECT()
は異常終了し、TP-STATUS
に次の値を設定します。特に説明がなければ、この障害は呼び出し側のトランザクションには影響しません。
TPEINVAL
]
TPENOENT
]
TPEITYPE
]
TPELIMIT
]
TPETRAN
]
TPETIME
]
TPBLOCK
と TPTIME
の両方が指定された場合にのみ発生します。
TPETIME
が発生します。ただし、例外が 1 つあります。例外は、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションのために送信されない要求 (つまり、TPNOTRAN
、TPNOBLOCK
、および TPNOREPLY
が設定された状態で TPACALL()
が呼び出される場合) です。
TX_ROLLBACK_ONLY
状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME
で異常終了します (前の段落で説明した例外を除く)。
TPGOTSIG
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPDISCON(3cbl)
、TPRECV(3cbl)
、TPSEND(3cbl)
TPDEQUEUE()
- キューからメッセージを取り出すルーチン
01
TPQUEDEF-REC
.
COPY TPQUEDEF.
01TPTYPE-REC
.
COPY TPTYPE.
01DATA-REC
.
COPY User data.
01TPSTATUS-REC
.
COPY STATDEF.
CALL "TPDEQUEUE" USINGTPQUEDEF-REC
TPTYPE-REC
DATA-REC
TPSTATUS-REC
.
TPDEQUEUE()
は、キュー スペース QSPACE-NAME
内の QNAME
で指定されるキューから、処理するメッセージを取り出します。
省略時設定では、キューの先頭のメッセージが取り出されます。キュー上のメッセージの順序は、そのキューの作成時に定義されます。アプリケーションは、MSGID
を使用してメッセージ識別子を指定するか、または CORRID
を使用して相関識別子を指定することにより、特定のメッセージをキューから取り出すことを要求できます。メッセージを現在取り出せない場合には、アプリケーションはメッセージを待つことを示すために、TPQUEDEF-REC
設定を使用することもできます。また、TPQUEDEF-REC
構造体を使用して、メッセージを読み出してもそれがキューから削除されないようにしたり、キュー上の相対位置が変更されないようにすることが可能です。この後のこのレコードについての説明を参照してください。
DATA-REC
は、キューから取り出されたメッセージの読み込み先を指定します。入力時の LEN
は、DATA-REC
へ移動する最大バイト数を示します。正常終了時には、LEN
には、DATA-REC
へ移動された実際のバイト数が入ります。REC-TYPE
および SUB-TYPE
には、それぞれ応答のタイプおよびサブタイプが入ります。応答が DATA-REC
より大きい場合は、DATA-REC
にはこのレコードに入るバイト数分のみが入ります。応答の残りは破棄され、TPDEQUEUE()
は異常終了して [TPTRUNCATE
] を返します。
正常終了時に LEN
が 0
である場合は、応答にはデータ部がなく、DATA-REC
は変更されていません。入力時に LEN
を 0
にすると、エラーになります。
呼び出し側がトランザクション モードにあり、TPTRAN
が設定されている場合は、メッセージは、トランザクション モードでキューから取り出されます。この結果、TPDEQUEUE
が正常終了して呼び出し側のトランザクションが正常にコミットされると、メッセージはキューから削除されます。呼び出し側のトランザクションが、明示的に、またはトランザクション タイムアウトあるいはなんらかの通信エラーの結果としてロールバックされると、メッセージはキュー上に残されます。つまり、キューからのメッセージの削除もロールバックされます。同じトランザクション内で、同じメッセージの登録と取り出しを行うことはできません。
呼び出し側がトランザクション モードにないか、または TPNOTRAN
が設定されている場合は、メッセージはトランザクション モードではキューから取り出されません。トランザクション モードでない場合に通信エラーまたはタイムアウトが発生した場合、アプリケーションには、メッセージが正しくキューから取り出されたかどうかがわからず、メッセージが失われることがあります。
次に、TPQUEDEF-REC
の有効な設定の一覧を示します。
TPNOTRAN
この設定を使用した状態で呼び出されたキューからのメッセージの取り出しに失敗した場合、呼び出し側のトランザクションは影響されません。TPNOTRAN
または TPTRAN
のいずれかが設定されていなければなりません。
TPTRAN
TPNOTRAN
または TPTRAN
のいずれかが設定されていなければなりません。
TPNOBLOCK
TPNOBLOCK
を設定した場合、メッセージの転送先である内部バッファがいっぱいであるなどのブロッキング状態が存在すると、呼び出しは異常終了し、TP-STATUS
に TPEBLOCK
が設定されます。TPNOBLOCK
を設定し、ターゲット キューが別のアプリケーションによって排他的にオープンされているというブロッキング状態が存在する場合、呼び出しは異常終了し、TP-STATUS
に TPEDIAGNOSTIC
が設定され、TPQUEDEF
レコードの DIAGNOSTIC
フィールドに QMESHARE
が設定されます。後者の場合、Oracle Tuxedo システム以外の Oracle Products に基づくほかのアプリケーションが、キューイング サービス API (QSAPI) を使用して読み取りと書き込み、またはそのいずれかを排他的に行うためにキューをオープンしています。TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPBLOCK
TPBLOCK
が設定されている場合に、ブロッキング状態が存在すると、その状態が解消されるかタイムアウト (トランザクション タイムアウトまたはブロッキング タイムアウト) が発生するまで、呼び出し側はブロックされます。TPQWAIT
の設定が指定されている場合は、このブロッキング条件には、キュー自体でのブロッキングは含まれません。TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPNOTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPNOCHANGE
DATA-REC
のタイプは変更できません。つまり、受信側が着信レコードのタイプを識別できる場合、応答レコードのタイプおよびサブタイプは、それぞれ TPTYPE-REC
内の REC-TYPE
および TPTYPE-REC
内の SUB-TYPE
と一致しなければなりません。TPNOCHANGE
または TPCHANGE
のいずれかが設定されていなければなりません。
TPCHANGE
TPTYPE-REC
内の REC-TYPE
および TPTYPE-REC
内の SUB-TYPE
に指定されたタイプまたはサブタイプと異なっていることが可能です。TPNOCHANGE
または TPCHANGE
のいずれかが設定されていなければなりません。
TPSIGRSTRT
TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
TPNOSIGRSTRT
TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
TPDEQUEUE()
が正常終了すると、アプリケーションは TPQUEDEF-REC
を使用してメッセージに関する追加情報を取得できます。この情報には、キューから取り出されたメッセージのメッセージ識別子、すべての応答または異常終了メッセージに付随し発信元がメッセージと元の要求を結び付けることができるようにする相関識別子、メッセージに対する配信サービスの品質、メッセージの応答に対する配信サービスの品質、応答が要求された場合は応答キューの名前、およびメッセージをキューから取り出すときの失敗に関する情報をアプリケーションが登録できる異常終了キューの名前が含まれます。これらについて以下に説明します。
TPQUEDEF-REC
は、アプリケーション プログラムが、キューからのメッセージの取り出しに関連する情報を渡したり、取得したりするために使用します。TPQUEDEF-REC
の設定は、構造体の他のどの要素が有効であるかを示すために使用されます。
TPDEQUEUE()
への入力時には、次の要素を TPQUEDEF-REC
に設定できます。
05 MSGID PIC X(32).
05 CORRID PIC X(32).
TPDEQUEUE()
の入力情報を制御する TPQUEDEF-REC
の有効な設定の一覧を次に示します。
TPQGETNEXT
TPQGETNEXT
、TPQGETBYMSGID
、または TPQGETBYCORRID
のいずれかを設定する必要があります。
TPQGETBYMSGID
MSGID
で識別されるメッセージが取り出されることを要求します。メッセージ識別子は、事前の TPENQUEUE()
呼び出しによって返されます。メッセージがあるキューから別のキューに移動した場合、メッセージ識別子は正しい値を示さないので注意が必要です。また、メッセージ識別子の値は 32 バイト全体が意味を持つので、MSGID
で識別される値は、たとえば空白を埋め込むなどして完全に初期化される必要があります。
TPQGETBYCORRID
CORRID
で識別されるメッセージが取り出されることを要求します。相関識別子は、アプリケーションが TPENQUEUE()
によってメッセージをキューに登録するときに指定されます。相関識別子の値は 32 バイト全体が意味を持つので、CORRID
で識別される値は、たとえば空白を埋め込むなどして完全に初期化される必要があります。
TPQWAIT
TPQNOWAIT
を設定します。TPQWAIT
が TPQGETBYMSGID
または TPQGETBYCORRID
とともに設定されると、指定されたメッセージ識別子または相関識別子を持つメッセージがキューに存在しない場合、エラーは返されません。代わりに、基準を満たすメッセージを取り出せるようになるまで、プロセスは待機する必要があります。プロセスには呼び出し側のトランザクション タイムアウトの影響を受けます。また、トランザクション モードでない場合、プロセスは TMQUEUE
プロセスで -t
オプションによって指定されたタイムアウトの影響を受けます。
TPDEQUEUE
は失敗し、TP-STATUS
に TPEDIAGNOSTIC
が設定され、DIAGNOSTIC
に QMESYSTEM
が設定されます。
TPQWAIT
制御パラメータを指定するそれぞれの TPDEQUEUE()
要求で、キュー マネージャ (TMQUEUE
) のアクション オブジェクトを利用できることが必要です。アクション オブジェクトを利用できない場合、TPDEQUEUE()
要求は異常終了します。利用できるキュー マネージャのアクション数は、キュー スペースの作成時または変更時に指定されます。待機中のキューからの取り出し要求が完了すると、関連するアクション オブジェクトは別の要求で使用できるようになります。
TPQPEEK
TPQPEEK
を設定すると、指定されたメッセージを読み取ってもキューから削除されなくなります。TPNOTRAN
フラグが設定されている必要があります。トランザクション内でメッセージをキューに登録されたメッセージやキューから取り出されたメッセージは、そのトランザクションが完了するまで読み取ることができません。
TPQPEEK
を使用してメッセージをキューから非破壊的に取り出す場合、非破壊的な取り出し要求をシステムが処理する少しの間、ほかの非ブロッキング状態のメッセージ取り出し操作からそのメッセージが認識されないことがあります。たとえば、特定の選択基準 (メッセージ識別子や相関識別子など) を使用してメッセージをキューから取り出す操作が、破棄せずに取り出しが現在行われているメッセージを探している場合などがあります。
TPDEQUEUE()
からの出力時には、次の要素が TPQUEDEF-REC
に設定されます。
05 PRIORITY PIC S9(9) COMP-5.
05 MSGID PIC X(32).
05 CORRID PIC X(32).
05 TPQUEQOS-DELIVERY-FLAG PIC S9(9) COMP-5.
05 TPQUEQOS-REPLY-FLAG PIC S9(9) COMP-5.
05 REPLYQUEUE PIC X(15).
05 FAILUREQUEUE PIC X(15).
05 DIAGNOSTIC PIC S9(9) COMP-5.
05 CLIENTID OCCURS 4 TIMES PIC S9(9) COMP-5
05 APPL-RETURN-CODE PIC S9(9) COMP-5.
05 APPKEY PIC S9(9) COMP-5.
TPDEQUEUE()
からの出力情報を制御する TPQUEDEF-REC
の有効な設定を次に示します。どの設定でも、TPDEQUEUE()
の呼び出し時に真の場合、メッセージがキューに入れられたときに提供された値が、レコード内の対応する要素に格納され、その設定は真のままになります。値を利用できない、つまりメッセージがキューに入れられたときに値が提供されていない場合、または TPDEQUEUE()
の呼び出し時に設定が真でない場合、その値が真でない状態で TPDEQUEUE()
は完了します。
TPQPRIORITY
TPDEQUEUE()
の呼び出しが正常終了し、メッセージが明示的な優先順位でキューに登録されていた場合は、その優先順位が PRIORITY
に格納されます。優先順位は 1 以上 100 以内の範囲内で、数値が高いほど優先順位も高くなります。つまり、高い数値のメッセージが低い数値のメッセージよりも先にキューから取り出されます。TPQNOPRIORITY
が設定されている場合、優先順位は使用できません。
TPQMSGID
TPDEQUEUE()
の呼び出しが正常終了した場合は、メッセージ識別子が MSGID
に格納されます。メッセージ識別子の値は、32 バイト全体が意味を持ちます。TPQNOMSGID
が設定されている場合、メッセージ識別子は使用できません。
TPQCORRID
TPDEQUEUE()
の呼び出しが正常終了し、メッセージが相関識別子を付けてキューに登録された場合は、相関識別子が CORRID
に格納されます。相関識別子の値は、32 バイト全体が意味を持ちます。Oracle Tuxedo /Q から渡されるメッセージに対するすべての応答は、元のメッセージの相関識別子を持ちます。TPQNOCORRID
が設定されている場合、相関識別子は使用できません。
TPQDELIVERYQOS
TPDEQUEUE()
の呼び出しが正常終了し、配信サービスの品質を設定してメッセージをキューに登録した場合は、TPQUEQOS-DELIVERY-FLAG
で指定されるフラグ TPQQOSDELIVERYDEFAULTPERSIST
、TPQQOSDELIVERYPERSISTENT
、または TPQQOSDELIVERYNONPERSISTENT
が配信サービスの品質を示します。TPQNODELIVERYQOS
が設定されている場合、サービスの配信品質は使用できません。
TPQREPLYQOS
TPDEQUEUE()
の呼び出しが正常終了し、応答サービスの品質を設定してメッセージをキューに登録した場合は、TPQUEQOS-REPLY-FLAG
で指定されるフラグ TPQQOSREPLYDEFAULTPERSIST
、TPQQOSREPLYPERSISTENT
、または TPQQOSREPLYNONPERSISTENT
が応答サービスの品質を示します。TPQNOREPLYQOS
を設定した場合、応答サービスの品質は指定できなくなります。
REPLYQUEUE
キューのデフォルトの配信ポリシーによって応答の配信サービスの品質が決まります。デフォルトの配信ポリシーは、メッセージに対する応答がキューに登録されるときに決定されます。つまり、元のメッセージがキューに登録されてから応答が登録されるまでの間に、応答キューのデフォルトの配信ポリシーが変更された場合、応答が最後に登録される時点で有効なポリシーが使用されます。
TPQREPLYQ
TPDEQUEUE()
の呼び出しが正常終了し、メッセージが応答キューを使用してキューに入れられた場合は、その応答キューの名前が REPLYQUEUE
に格納されます。メッセージへの応答は、要求メッセージと同じキュー スペース内の指定されたキューに登録されます。TPQNOREPLYQ
が設定されている場合、応答キューは使用できません。
TPQFAILUREQ
TPDEQUEUE()
の呼び出しが正常終了し、メッセージが異常終了キューを使用してキューに入れられた場合は、その異常終了キューの名前が FAILUREQUEUE
に格納されます。異常終了メッセージは、要求メッセージと同じキュー スペース内の指定された異常終了キューに登録されます。TPQNOFAILUREQ
が設定されている場合、異常終了キューは使用できません。
TPQUEDEF-REC
の残りの設定は、TPDEQUEUE()
が呼び出されると、TPQNOTOP
、TPQNOBEFOREMSGID
、TPQNOTIME_ABS
、TPQNOTIME_REL
、TPQNOEXPTIME_ABS
、TPQNOEXPTIME_REL
、および TPQNOEXPTIME_NONE
に設定されます。
TPDEQUEUE()
の呼び出しが異常終了し、TP-STATUS
に TPEDIAGNOSTIC
が設定された場合は、異常終了の原因を示す値が DIAGNOSTIC
に返されます。返される可能性のある値は、この後の「診断」の項で定義しています。
また、TPDEQUEUE()
呼び出しが正常終了した場合の出力時には、APPKEY
にアプリケーション認証キーが設定され、CLIENTID
に要求の発信元であるクライアントの識別子が設定され、APPL-RETURN-CODE
にメッセージ登録時に設定されたユーザ戻りコードが設定されます。
TPDEQUEUE()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。
次の条件が発生すると、TPDEQUEUE()
は異常終了し、TP-STATUS
に次の値を設定します。特に説明がなければ、この障害は呼び出し側のトランザクションには影響しません。
TPEINVAL
]
TPENOENT
]
QSPACE-NAME
を利用できないので、これにアクセスできません (関連する TMQUEUE(5) サーバは利用できません)。または、グローバル トランザクション テーブル (GTT) にエントリがないので、グローバル トランザクションを開始できません。
TPEOTYPE
]
REC-TYPE
および SUB-TYPE
のいずれかは、呼び出し側が認識しているものではありません。あるいは、TPNOCHANGE
が設定されていて、REC-TYPE
と SUB-TYPE
が、キューから取り出されたメッセージの REC-TYPE および SUB-TYPE と一致しません。DATA-REC
も TPTYPE-REC
も変更されません。呼び出しがトランザクション モードで行われ、このエラーが発生すると、トランザクションはアボートのみになり、メッセージはキューに残ります。
TPTRUNCATE
]
TPETIME
]
TPBLOCK
と TPTIME
の両方が指定された場合にのみ発生します。いずれの場合でも、DATA-REC
も TPTYPE-REC
も変更されません。
TPETIME
が発生します。ただし、例外が 1 つあります。例外は、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションのために送信されない要求 (つまり、TPNOTRAN
、TPNOBLOCK
、および TPNOREPLY
が設定された状態で TPACALL()
が呼び出される場合) です。
TX_ROLLBACK_ONLY
状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME
で異常終了します (前の段落で説明した例外を除く)。
TPEBLOCK
]
TPGOTSIG
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPEDIAGNOSTIC
]
次の診断値は、キューからのメッセージの取り出し中に返されます。
QMEINVAL
]
QMEBADRMID
]
QMENOTOPEN
]
QMETRAN
]
TPNOTRAN
設定で呼び出しが行われ、キューからメッセージを取り出すトランザクションの開始を試みた際に、エラーが発生しました。この診断は、Oracle Tuxedo リリース 7.1 以降のキュー マネージャでは返されません。
QMEBADMSGID
]
QMESYSTEM
]
QMEOS
]
QMEABORTED
]
QMEPROTO
]
QMEBADQUEUE
]
QMENOMSG
]
QMEINUSE
]
QMESHARE
]
qmadmin(1)、TPENQUEUE(3cbl)
、TMQUEUE(5)
01
TPSVCDEF-REC
.
COPY TPSVCDEF.
01 TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPDISCON" USING TPSVCDEF-REC
TPSTATUS-REC
.
TPDISCON()
は、通信ハンドル、TPSVCDEF-REC
内の COMM-HANDLE
で指定された接続を即座に切断し、接続の他方の側で TPEV-DISCONIMM
イベントを生成します。
TPDISCON()
は会話の開始プロセスからしか呼び出せません。TPDISCON()
は、呼び出しに使用された通信ハンドルに対応する会話サービスの中からは呼び出せません。会話サービスは TPRETURN()
を使用して、会話の該当部分が完了したことを通知しなければなりません。同様に、会話サービスとのやりとりを行うプログラムが TPDISCON()
を発行できる場合でも、正しい結果を保証するためには、そのサービスに TPRETURN()
で接続を切断させるようにしてください。接続の起動元がサーバである場合には、TPRETURN()
を使用し正常に切断を行うこともできます。接続の起動元がトランザクション モードにある場合、TPCOMMIT()
または TPABORT()
を使用して、接続を正常に終了させることができます。
TPDISCON()
を使用すると、接続はただちに切断されます (つまり、正常終了ではなく、中途終了)。したがって、あて先に届いていないデータは失われます。TPDISCON()
は、接続の他方の側のプログラムが呼び出し側のトランザクションに参加している場合でも発行されます。この場合、このトランザクションは中途終了します。また、呼び出し側は、TPDISCON()
が呼び出されるときにその接続の制御権をもっている必要はありません。
TPDISCON()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。
次の条件が発生すると、TPDISCON()
は異常終了し、TP-STATUS
に次の値を設定します。
TPEBADDESC
]
TPETIME
]
TPDISCON()
を呼び出すと、TPDISCON()
が正常に呼び出されても、トランザクションが「アボートのみ」とマークされる可能性があります。
TPBLOCK
と TPTIME
の両方が指定された場合にのみ発生します。
TPETIME
で異常終了します。例外は、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションのために送信されない要求 (つまり、TPNOTRAN
、TPNOBLOCK
、および TPNOREPLY
が設定された状態で TPACALL()
が呼び出される場合) です。
TX_ROLLBACK_ONLY
状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME
で異常終了します (前の段落で説明した例外を除く)。
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPABORT(3cbl)
、TPCOMMIT(3cbl)
、TPCONNECT(3cbl)
、TPRECV(3cbl)
、TPRETURN(3cbl)
、TPSEND(3cbl)
TPENQUEUE()
- メッセージをキューに登録するルーチン
01
TPQUEDEF-REC
.
COPY TPQUEDEF.
01TPTYPE-REC
.
COPY TPTYPE.
01DATA-REC
.
COPY User data.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPENQUEUE" USINGTPQUEDEF-REC
TPTYPE-REC
DATA-REC
TPSTATUS-REC
.
TPENQUEUE()
は、キュー スペース QSPACE-NAME
内の QNAME
で指定されるキューにメッセージを格納します。キュー スペースは、キューを集めたもので、そのうちの 1 つのキューが QNAME
でなければなりません。
メッセージが Oracle Tuxedo ATMI のサーバを対象としている場合、QNAME
は、サーバによって提供されるサービスの名前と一致します。システムが提供するサーバである TMQFORWARD(5) は、メッセージをキューから取り出し、キューと同じ名前のサービスを提供するサーバにそのメッセージを転送するデフォルトの機構となります。発信元が応答を期待していた場合、特に指定されていなければ、転送されたサービス要求の応答は発信元のキューに格納されます。発信元は、後で応答メッセージをキューから取り出します。キューは、任意の 2 つの Oracle Tuxedo ATMI のプロセス間 (クライアントやサーバ) における信頼性の高いメッセージ転送機構としても使用できます。この場合、キューの名前はサービス名とは一致せず、メッセージ転送のための名前に関連します。
メッセージのデータ部は、DATA-REC
によって指定されます。TPTYPE-REC
内の LEN
は、キューに登録する DATA-REC
の大きさを指定します。ただし、DATA-REC
が長さの指定を必要としないタイプのレコードである場合 LEN
は無視されます (0
でかまいません)。TPTYPE-REC
内の REC-TYPE
が SPACES
の場合には、DATA-REC
および LEN
は無視され、データ部なしでメッセージがキューに登録されます。TPTYPE-REC
内の REC-TYPE
および SUB-TYPE
は、QSPACE-NAME
が認識する REC-TYPE
および SUB-TYPE
のいずれかと一致しなければなりません。
メッセージは、QSPACE-NAME
用に定義された優先順位が事前の TPSPRIO()
の呼び出しによって無効化されていない限り、QSPACE-NAME 用の優先順位でキューに登録されます。
呼び出し側がトランザクションにあり、TPTRAN
が設定されている場合は、メッセージは、トランザクション モードでキューに登録されます。この結果、TPENQUEUE()
が正常終了して呼び出し側のトランザクションが正常にコミットされると、メッセージは、トランザクションの完了後に処理されることが保証されます。呼び出し側のトランザクションが、明示的に、またはトランザクション タイムアウトあるいは何らかの通信エラーの結果としてロールバックされると、メッセージはキューから削除されます。つまり、キューへのメッセージの登録もロールバックされます。同じトランザクション内で同じメッセージの登録と取り出しを行うことはできません。
呼び出し側がトランザクション モードにないか、または TPNOTRAN
が設定されている場合は、メッセージはトランザクション モードではキューに登録されません。TPENQUEUE()
が正常終了した後は、サブミットされたメッセージがキューに登録されたことが保証されます。トランザクション モードでないときに通信エラーまたはタイムアウトが発生した場合、アプリケーションには、メッセージが正しくキューに格納されたかどうかがわかりません。
メッセージが処理される順序は、以下に説明するように、アプリケーションによって TPQUEDEF-REC
を介して制御されます。デフォルトのキューの順序付けは、キューの作成時に設定されます。
次に、TPQUEDEF-REC
の有効な設定の一覧を示します。
TPNOTRAN
この設定を使用した状態で呼び出されたキューへのメッセージの登録が失敗した場合、呼び出し側のトランザクションは影響されません。TPNOTRAN
または TPTRAN
のいずれかが設定されていなければなりません。
TPTRAN
TPNOTRAN
または TPTRAN
のいずれかが設定されていなければなりません。
TPNOBLOCK
TPNOBLOCK
を設定した場合、メッセージの転送先である内部バッファがいっぱいであるなどのブロッキング状態が存在すると、呼び出しは異常終了し、TP-STATUS
に TPEBLOCK
が設定されます。TPNOBLOCK
を設定し、ターゲット キューが別のアプリケーションによって排他的にオープンされているというブロッキング状態が存在する場合、呼び出しは異常終了し、TP-STATUS
に TPEDIAGNOSTIC
が設定され、TPQUEDEF
レコードの DIAGNOSTIC
フィールドに QMESHARE
が設定されます。後者の場合、Oracle Tuxedo システム以外の Oracle Products に基づくほかのアプリケーションが、キューイング サービス API (QSAPI) を使用して読み取りと書き込み、またはそのいずれかを排他的に行うためにキューをオープンしています。TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPBLOCK
TPBLOCK
が設定されている場合に、ブロッキング状態が存在すると、その状態が解消されるかタイムアウト (トランザクション タイムアウトまたはブロッキング タイムアウト) が発生するまで、呼び出し側はブロックされます。TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPNOTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPSIGRSTRT
TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
TPNOSIGRSTRT
TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
キューへのメッセージ登録に関する追加情報は、TPQUEDEF-REC
を介して指定できます。この情報には、デフォルトのキューの順序付けを無効にしてキューの先頭または登録済みのメッセージの前にメッセージを登録するための値、キューからメッセージを取り出すまでの絶対時間または相対時間、メッセージが期限切れになりキューから削除される絶対時間または相対時間、メッセージ配信サービスの品質、メッセージが応答する際のサービス品質、メッセージとそのメッセージに関連付けられた応答または異常終了メッセージを結び付けるときに役立つ相関識別子、応答を登録するキューの名前、およびすべての異常終了メッセージを登録するキューの名前が含まれます。
TPQUEDEF-REC
は、アプリケーション プログラムが、キューへのメッセージの登録に関連する情報を渡したり、取得したりするために使用します。設定は、レコード内のどの要素が有効であるかを示すために使用されます。
TPENQUEUE()
への入力時には、次の要素を TPQUEDEF-REC
に設定できます。
05 DEQ-TIME PIC S9(9) COMP-5.
05 PRIORITY PIC S9(9) COMP-5.
05 MSGID PIC X(32).
05 CORRID PIC X(32).
05 TPQUEQOS-DELIVERY-FLAG PIC S9(9) COMP-5.
05 TPQUEQOS-REPLY-FLAG PIC S9(9) COMP-5.
05 EXP-TIME PIC S9(9) COMP-5.
05 REPLYQUEUE PIC X(15).
05 FAILUREQUEUE PIC X(15).
05 APPL-RETURN-CODE PIC S9(9) COMP-5.
次の値は、どの値が TPQUEDEF-REC
に設定されるかを示します。
TPQTOP
TPQDEFAULT
を設定します。TPQTOP
、TPQBEFOREMSGID
、TPQDEFAULT
のいずれかを設定しなければなりません。
TPQBEFOREMSGID
MSGID
によって識別されるメッセージの前に登録されます。この要求は、順序付けを無効にするようにキューが設定されているかどうかによって、使用できない場合があります。デフォルトのキューの順序を使用する場合は、TPQDEFAULT
を設定します。TPQTOP
、TPQBEFOREMSGID
、TPQDEFAULT
のいずれかを設定しなければなりません。
TPQTIME-ABS
DEQ-TIME
によって指定された時間の後に処理されます。DEQ-TIME
は、time
(2) または mktime
(3C) によって生成される絶対時間値です (協定世界時 (UTC) 1970 年 1 月 1 日 00:00:00 から経過した秒数)。絶対時間値も相対時間値も設定しない場合は、TPQNOTIME
を設定してください。TPQTIME-ABS
、TPQTIME-REL
、TPQNOTIME
のいずれかを設定しなければなりません。絶対時間は、キュー マネージャ プロセスが常駐するマシンの時計によって決定されます。
TPQTIME-REL
DEQ-TIME
は、キューへの登録が完了した後から、サブミットされたメッセージが処理されるまでの遅延秒数を指定します。絶対時間値も相対時間値も設定しない場合は、TPQNOTIME
を設定してください。TPQTIME-ABS
、TPQTIME-REL
、TPQNOTIME
のいずれかを設定しなければなりません。
TPQPRIORITY
PRIORITY
に格納されます。優先順位は、1 以上 100 以下の範囲でなければなりません。数値が高いほど優先順位も高くなり、高い数値のメッセージが低い数値のメッセージより先にキューから取り出されます。優先順位によって順序付けられていないキューでは、この値は参考として使用されます。TPQNOPRIORITY
が設定されている場合、メッセージの優先順位はデフォルトで 50 です。
TPQCORRID
TPDEQUEUE()
によってキューから取り出されるとき、CORRID
に指定された相関識別子の値を使用することができます。この識別子は、キューに登録されるすべての応答メッセージまたは異常終了メッセージに付加されるので、アプリケーションは応答を特定の要求に結び付けることができます。相関識別子を使用できない場合は、TPQNOCORRID
を設定します。
TPQREPLYQ
REPLYQUEUE
に指定された応答キューが、キューに入れられたメッセージに関連付けられます。メッセージへの応答はすべて、要求メッセージと同じキュー スペース内の、指定されたキューに登録されます。応答キューの名前を使用できない場合は、TPQNOREPLYQ
を設定します。
TPQFAILUREQ
FAILUREQUEUE
で指定された異常終了キューは、キューに入れられたメッセージに関連付けられます。(1) キューに登録されたメッセージが TMQFORWARD()
によって処理され、(2) TMQFORWARD
が -d
オプションで起動され、(3) サービスが異常終了して NULL 以外の応答を返す場合は、応答とそれに関連付けられた TPSTATUS
レコード内の APPL-RETURN-CODE
で構成される異常終了メッセージが、元の要求メッセージと同じキュー スペース内の指定されたキューに入ります。異常終了キューの名前を使用できない場合は、TPQNOFAILUREQ
を設定します。
TPQDELIVERYQOS
TPQREPLYQOS
TPQDELIVERYQOS
フラグを設定すると、TPQUEQOS-DELIVERY-FLAG
で指定されるフラグを使用して、メッセージの配信サービスの品質を制御できます。相互に排他的な次のフラグ、TPQQOSDELIVERYDEFAULTPERSIST
、TPQQOSDELIVERYPERSISTENT
、または TPQQOSDELIVERYNONPERSISTENT
のいずれかを設定する必要があります。TPQDELIVERYQOS
を設定しない場合、TPQNODELIVERYQOS
を設定する必要があります。TPQNODELIVERYQOS
を設定すると、ターゲット キューのデフォルトの配信ポリシーによって、メッセージの配信サービスの品質が決まります。
TPQREPLYQOS
フラグを設定すると、TPQUEQOS-REPLY-FLAG
で指定されるフラグを使用して、応答メッセージの配信サービスの品質を制御できます。相互に排他的な次のフラグ、TPQQOSREPLYDEFAULTPERSIST
、TPQQOSREPLYPERSISTENT
、または TPQQOSREPLYNONPERSISTENT
のいずれかを設定する必要があります。TPQREPLYQOS
フラグは、TMQFORWARD
で処理されるメッセージから応答が返されるときに使用されます。サービスを呼び出す際に TMQFORWARD
を使用しないアプリケーションでは、応答メカニズムのヒントとして TPQREPLYQOS
フラグを使用できます。
TPQREPLYQOS
を設定しない場合、TPQNOREPLYQOS
を設定する必要があります。TPQNOREPLYQOS
を設定すると、REPLYQUEUE
キューのデフォルトの配信ポリシーによって、応答の配信サービスの品質が決まります。デフォルトの配信ポリシーは、メッセージに対する応答がキューに登録されるときに決定される点に注意してください。つまり、元のメッセージがキューに登録されてから応答が登録されるまでの間に、応答キューのデフォルトの配信ポリシーが変更された場合、応答が最後に登録される時点で有効なポリシーが使用されます。
TPQUEQOS-DELIVERY-FLAG
フラグおよび TPQUEQOS-REPLY-FLAG
フラグの一覧を示します。
TPQEXPTIME-ABS
EXP-TIME
に格納された値で示されます。EXP-TIME
は、time
(2) または mktime
(3C) によって生成された絶対時間に設定されなければなりません (世界協定時 (UTC) 1970 年 1 月 1 日 00:00:00 から経過した秒数)。
TPQEXPTIME-ABS
、TPQEXPTIME-REL
、TPQEXPTIME-NONE
、TPQNOEXPTIME
のいずれかを設定しなければなりません。
TPQEXPTIME-REL
EXP-TIME
に格納された値で示されます。
TPQEXPTIME-ABS
、TPQEXPTIME-REL
、TPQEXPTIME-NONE
、TPQNOEXPTIME
のいずれかを設定しなければなりません。
TPQEXPTIME-NONE
TPQEXPTIME-ABS
、TPQEXPTIME-REL
、TPQEXPTIME-NONE
、TPQNOEXPTIME
のいずれかを設定しなければなりません。
TPQNOEXPTIME
TPQEXPTIME-ABS
、TPQEXPTIME-REL
、TPQEXPTIME-NONE
、TPQNOEXPTIME
のいずれかを設定しなければなりません。
また、TPSTATUS-REC 内の APPL-RETURN-CODE
にユーザ戻り値を設定することができます。この値は、メッセージをキューから取り出すアプリケーションに返されます。
TPENQUEUE()
からの出力時には、次の要素が TPQUEDEF-REC
に設定されます。
05 MSGID PIC X(32).
05 DIAGNOSTIC PIC S9(9) COMP-5.
TPENQUEUE()
からの出力情報を制御する TPQUEDEF-REC
の有効な設定を次に示します。TPENQUEUE()
の呼び出し時にこの設定が真の場合、Oracle Tuxedo /Q サーバ TMQUEUE(5) は、レコード内の対応する要素にメッセージ識別子を格納します。
TPENQUEUE()
の呼び出し時にこの設定が真でない場合、
TMQUEUE()
は、レコード内の対応する要素にメッセージ識別子を格納しません。
TPQMSGID
TPENQUEUE()
の呼び出しが正常終了した場合は、メッセージ識別子が MSGID
に格納されます。メッセージ識別子の値は 32 バイト全体が意味を持つので、MSGID
に格納される値は、たとえば NULL 文字を埋め込むなどして完全に初期化する必要があります。初期化に使用される実際の埋め込み文字は、Oracle Tuxedo /Q コンポーネントのリリースによって異なります。TPQNOMSGID
が設定されている場合、メッセージ識別子は使用できません。
制御構造体の残りのメンバーは、TPENQUEUE()
への入力では使用しません。
TPENQUEUE()
の呼び出しが異常終了し、TP-STATUS
に TPEDIAGNOSTIC
が設定された場合は、異常終了の原因を示す値が DIAGNOSTIC
に返されます。返される可能性のある値は、この後の「診断」の項で定義しています。
TPENQUEUE()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。
次の条件が発生すると、TPENQUEUE()
は異常終了し、TP-STATUS
に次の値を設定します。特に説明がなければ、この障害は呼び出し側のトランザクションには影響しません。
TPEINVAL
]
TPENOENT
]
QSPACE-NAME
を利用できないので、これにアクセスできません (関連する TMQUEUE(5) サーバは利用できません)。または、グローバル トランザクション テーブル (GTT) にエントリがないので、グローバル トランザクションを開始できません。
TPETIME
]
TPBLOCK
と TPTIME
の両方が指定された場合にのみ発生します。
TPETIME
が発生します。ただし、例外が 1 つあります。例外は、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションのために送信されない要求 (つまり、TPNOTRAN
、TPNOBLOCK
、および TPNOREPLY
が設定された状態で TPACALL()
が呼び出される場合) です。
TX_ROLLBACK_ONLY
状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME
で異常終了します (前の段落で説明した例外を除く)。
TPEBLOCK
]
TPGOTSIG
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPEDIAGNOSTIC
]
QMEINVAL
]
QMEBADRMID
]
QMENOTOPEN
]
QMETRAN
]
TPNOTRAN
設定で呼び出しが行われ、メッセージをキューに登録するトランザクションの開始を試行した際に、エラーが発生しました。この診断は、Oracle Tuxedo リリース 7.1 以降のキュー マネージャでは返されません。
QMEBADMSGID
]
QMESYSTEM
]
QMEOS
]
QMEABORTED
]
QMEPROTO
]
QMEBADQUEUE
]
QMENOSPACE
]
QMENOSPACE
が返されます。(1) キュー スペースに割り当てられたディスク (永続的) スペースの容量、(2) キュー スペースに割り当てられたメモリ (非永続的) スペースの容量、(3) キュー スペースで使用可能な、同時にアクティブ状態になるトランザクションの最大数、(4) キュー スペースに一度に入れることができる最大メッセージ数、(5) キューイング サービス コンポーネントが処理できる並列アクションの最大数、または (6) キューイング サービス コンポーネントを同時に使用できる認証ユーザの最大数。
QMERELEASE
]
QMESHARE
]
qmadmin(1)、TPDEQUEUE(3cbl)
、TPSPRIO(3cbl)
、TMQFORWARD(5), TMQUEUE(5)
TPFORWAR()
- Oracle Tuxedo ATMI のサービス要求を別のルーチンに転送
01
TPSVCDEF-REC
.
COPY TPSVCDEF.
01TPTYPE-REC
.
COPY TPTYPE.
01DATA-REC
.
COPY User data.
01TPSTATUS-REC
.
COPY TPSTATUS.
COPY TPFORWAR REPLACING TPSVCDEF-REC BYTPSVCDEF-REC
TPTYPE-REC BY
TPTYPE-REC
DATA-REC BY
DATA-REC
TPSTATUS-REC BY
TPSTAUS-REC
TPFORWAR()
を使用すると、サービス ルーチンはクライアントの要求を別のサービス ルーチンに転送して処理させることができます。TPFORWAR()
には EXIT PROGRAM
文が含まれるので、Oracle Tuxedo ATMI のディスパッチャに制御を確実に正しく返すために、TPFORWAR() はそれが起動されたルーチンと同じルーチンの中から呼び出されなければなりません。つまり、TPFORWAR()
をサービス ルーチンのサブ プログラムから呼び出してはなりません。制御が Oracle Tuxedo ATMI のディスパッチャに返されないからです。TPFORWAR()
を会話サービスの中から呼び出すことはできません。
このルーチンは、DATA-REC
に入っているデータを使用して TPSVCDEF-REC
内の SERVICE-NAME
によって指定されるサービスに要求を転送します。要求を転送するサービス ルーチンは応答を受け取りません。要求の転送が終わると、サービス ルーチンは Oracle Tuxedo ATMI のディスパッチャに戻り、他の作業を行える状態になります。なお、転送された要求からの応答は期待しないため、この要求は、要求を転送するサービスと同じ実行可能プログラム内の任意のサービス ルーチンに、エラーなしで転送することができます。
サービス ルーチンがトランザクション モードであると、このルーチンはトランザクションの呼び出し側の部分を、そのトランザクションの起動元が TPCOMMIT()
または TPABORT()
のいずれかを出したときに完了できるような状態にします。トランザクションがサービス ルーチンの実行中に TPBEGIN()
により明示的に開始された場合、このトランザクションを TPCOMMIT()
または TPABORT()
で終了させてから、TPFORWAR()
を呼び出さなければなりません。このため、転送チェインに関与するすべてのサービスは、トランザクション モードで起動するか、あるいはどれもトランザクション モードでは起動しないようにします。
転送チェインの最後のサーバは、TPRETURN()
を使用して要求の発信元に応答を返します。要約して言えば、TPFORWAR()
は待機している要求者に応答を返す役割を別のサーバに転送するわけです。
TPFORWAR()
は、サービス ルーチンが出したサービス要求から期待されるすべての応答を受け取った後、呼び出すようにしてください。受信されていない未終了の応答は、受信後、Oracle Tuxedo ATMI のディスパッチャによって自動的に取り除かれます。さらに、以後、これらの応答の通信ハンドルは無効になり、要求は SERVICE-NAME
に転送されません。
DATA-REC
は送信されるレコードであり、TPTYPE-REC
内の LEN
は、送信する DATA-REC
の大きさを指定します。ただし、DATA-REC
が長さの指定を必要としないタイプのレコードである場合 LEN
は無視されます (0
でかまいません)。TPTYPE-REC
内の REC-TYPE
が SPACES
の場合、DATA-REC
および LEN
は無視され、長さゼロのデータで要求がデータ長ゼロで送信されます。REC-TYPE
が STRING
で、LEN
が 0
の場合は、要求はデータ部なしで送信されます。
サービス ルーチンの作成者は TPFORWAR()
の呼び出し後は制御を保持しないので、シグナル リスタートによるブロッキング送信が使用されます (つまり、TPSIGRSTRT
)。現時点では、TPSVCDEF-REC
の設定は将来使用するために予約されており、指定しても無視されます。
サービス ルーチンは、呼び出し側、Oracle Tuxedo ATMI のディスパッチャに何も値を返さないので、TP-STATUS
は設定されません。
このルーチンに渡されたパラメータの処理中またはそのルーチン自体の処理中にエラーが発生した場合、異常終了メッセージが最初の要求元に返されます (応答が送信されない場合を除く)。未終了の応答または従属接続がある場合や呼び出し側のトランザクションに中途終了マークが付けられた場合には、異常終了メッセージの原因となる障害であるとみなされます。要求者は、エラーを示す TPESVCERR()
によって、異常終了メッセージを検出します。このようなエラーが発生した場合、呼び出し側のデータは送信されません。また、このエラーが原因で、呼び出し側の現在のトランザクションに中途終了のマークが付けられます。
サービス ルーチンの処理中あるいは要求の転送中にトランザクション タイムアウトになると、TPCALL()
または TPGETRPLY()
で応答を待つ要求元は TPETIME
エラーを受け取ります。サービスがトランザクション内部で失敗すると、そのトランザクションはタイムアウトになり、TX_ROLLBACK_ONLY
状態になります。また、そのトランザクションの後続の ATMI 呼び出しは、すべて TPETIME
で異常終了します。待ち状態にある要求元は、どのようなデータも受信しません。ただし、サービス ルーチンは TPRETURN()
または TPFORWAR()
のいずれかを使用して終了することになっています。会話サービス ルーチンでは、TPRETURN()
を使用しなければならないため、TPFORWAR()
は使用できません。
サービス ルーチンが TPRETURN()
も TPFORWAR()
も使用しない場合、または TPFORWAR()
が会話サーバから呼び出された場合、そのサーバはログ ファイルに警告メッセージを出力し、最初の要求者にサービス エラーを返します。また、従属接続に対するオープン接続はすべて、ただちに切断され、未終了の非同期応答は無効とマークされます。サーバが異常終了時にトランザクション モードにあった場合は、そのトランザクションには中途終了マークが付けられます。TPRETURN()
または TPFORWAR()
のいずれかがサービス ルーチンとは別に (たとえば、クライアント、TPSVRINIT()
、TPSVRDONE()
などから) 使用されても、これらのルーチンは何も影響を及ぼさず終了するだけです。
TPCONNECT(3cbl)
、TPRETURN(3cbl)
TPGBLKTIME()
- 以前に TPSBLKTIME
で設定されたブロック時間値を取得する
01 TPBLKDEF-REC.
COPY TPBLKDEF.
01 TPSTATUS-REC.
COPY TPSTATUS.
CALL “TPGBLKTIME” USING TPBLKDEF-REC TPSTATUS-REC.
TPGBLKTIME()
は、以前に設定された 1 秒あたりのブロック時間値を取得し、この値を TBLKDEF-REC
の BLKTIME
に格納します。TPGBLKTIME()
にブロック時間フラグ値を指定した場合、それに一致するフラグ値が設定されていないと戻り値 0
が返されます。ブロック時間フラグ値として 0
未満の値を指定するとエラーが発生します。
次に、有効な TPBLKDEF-REC
フラグ値の一覧を示します。
TPBLK-ALL
TPGBLKTIME()
にブロック時間フラグ値 (TPBLK-NEXT
または TPBLK-ALL
) を指定しない場合、以前にブロック時間フラグ値 (TPBLK-NEXT
または TPBLK-ALL
) を指定した TPSBLKTIME()
呼び出しで設定された次のブロッキング API のブロック時間値、またはシステム全体のデフォルト ブロック時間値が返されます。
注意 : | ワークステーション クライアントがブロック時間フラグ値 (TPBLK-NEXT または TPBLK-ALL ) なしで TPGBLKTIME() を呼び出した場合は、システム全体のデフォルト ブロック時間値を返すことはできません。この場合は、値 0 が返されます。 |
TPGBLKTIME()
は正常終了時には [TPOK]
に TP-STATUS
を設定し、以前に設定されたブロック時間値があればその値を TBLKDEF-REC
の BLKTIME
に返します。BLKTIME
値 0 は、以前に設定された入力ブロック時間値が存在しないことを示します。
次の条件が発生すると、TPGBLKTIME
は異常終了し、TP-STATUS
に次のいずれかの値を設定します。異常終了しても、トランザクション タイムアウト値には影響しません。
TPEINVAL
]
TPESYSTEM
]
TPCALL(3cbl)、TPCONNECT(3cbl)、TPRECV(3cbl)、TPSBLKTIME(3cbl)、UBBCONFIG(5)
TPGETCTXT()
- 現在のアプリケーション関連のコンテキスト識別子を取り出す
01 TPCONTEXTDEF-REC.
COPY TPCONTEXTDEF.
01 TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPGETCTXT" USING TPCONTEXTDEF-REC TPSTATUS-REC.
TPGETCTXT()
は、現在のアプリケーション関連のコンテキストを表す識別子を検索し、その識別子を TPCONTEXTDEF-REC
内の CONTEXT
に入れます。一般的な COBOL アプリケーションの処理は次のとおりです。
TPGETCTXT()
は、シングルコンテキスト アプリケーションおよびマルチコンテキスト アプリケーションで呼び出すことができます。
TPGETCTXT
は正常終了時には、TP-STATUS
に [TPOK
] を設定し、プログラムのコンテキスト識別子を TPCONTEXTDEF-REC
内の CONTEXT
に入れます。CONTEXT
には現在のコンテキスト ID が設定されます。これは、次のいずれかで表されます。
注意 : | TPINVALIDCONTEXT が COBOL プログラムで返されることはありません。この値は、マルチスレッドのプログラムでしか返されないからです。 |
TPGETCTXT
の異常終了時には、TP-STATUS
に次のいずれかの値が設定されます。
TPEINVAL
]
TPESYSTEM
]
TPEOS
]
「COBOL アプリケーション トランザクション モニタ インタフェースの紹介」、TPSETCTXT(3cbl)
TPGETLEV()
- Oracle Tuxedo ATMI のトランザクションの進行状況のチェック
01
TPTRXLEV-REC
.
COPY TPTRXLEV.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPGETLEV" USINGTPTRXLEV-REC
TPSTATUS-REC
.
TPGETLEV()
は現在のトランザクション レベルを呼び出し側に返します。現時点では、定義されているレベルは TP-NOT-IN-TRAN
と TP-IN-TRAN
だけです。
TPGETLEV()
は正常終了時には、TP-STATUS
に [TPOK
] を設定し、TPTRXLEV-REC
に値を設定します。TPTRXLEV-REC に設定される値は、進行中のトランザクションがないことを示す TP-NOT-IN-TRAN
、トランザクションが進行中であることを示す TP-IN-TRAN
のいずれかです。
次の条件が発生すると、TPGETLEV()
は異常終了し、TP-STATUS
に次の値を設定します。
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPBEGIN()
、TPCOMMIT()
、および TPABORT()
を使用して Oracle Tuxedo ATMI のトランザクションを記述する際には、XA インタフェースに準拠した (および呼び出し側に適切にリンクされている) リソース マネージャが行う作業のみがトランザクションとしての特性を備えていることを忘れないようにすることが重要です。トランザクションで行われるその他の処理内容は、TPCOMMIT()
や TPABORT()
の影響を受けません。そのリソース マネージャが行った処理が Oracle Tuxedo ATMI のトランザクションの一部となるよう、XA インタフェースを満たすリソース マネージャをサーバにリンクする方法については、「buildserver(1)」を参照してください。
TPABORT(3cbl)
、TPBEGIN(3cbl)
、TPCOMMIT(3cbl)
、TPSCMT(3cbl)
TPGETRPLY()
- 非同期メッセージからの応答の取得
01
TPSVCDEF-REC
.
COPY TPSVCDEF.
01TPTYPE-REC
.
COPY TPTYPE.
01DATA-REC
.
COPY User data.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPGETRPLY" USINGTPSVCDEF-REC
TPTYPE-REC
DATA-REC
TPSTATUS-REC
.
TPGETRPLY()
は、事前に送られた要求の応答を返します。TPGETRPLY()
は、特定の要求に対する応答、または取得可能なすべての応答を返します。選択可能なこの 2 つについて、ここで説明します。
DATA-REC
は、応答を読み込む場所を指定し、TPTYPE-REC
内の LEN
は、DATA-REC
に移動すべき最大バイト数を示します。また、TPTYPE-REC
の REC-TYPE
を指定する必要があります。TPGETRPLY()
の正常終了時には、実際に DATA-REC
に移動されたバイト数が LEN
に入り、TPTYPE-REC
内の REC-TYPE
および SUB-TYPE
には、それぞれデータのタイプおよびサブタイプが入ります。応答が DATA-REC
より大きい場合は、DATA-REC
にはこのレコードに入るバイト数分のみが入ります。応答の残りは破棄され、TPGETRPLY()
は TPTRUNCATE()
を設定します。
正常終了時に LEN
が 0
である場合は、応答にはデータ部がなく、DATA-REC
は変更されていません。入力時に LEN
を 0
にすると、エラーになります。
次に、TPSVCDEF-REC
の有効な設定の一覧を示します。
TPGETANY
TPGETRPLY()
は TPSVCDEF-REC
内の COMM-HANDLE
によって示される通信ハンドルを無視し、存在する応答があればそれらを返し、返された応答の通信ハンドルを指すよう COMM-HANDLE
を設定します。応答が存在しなければ、TPGETRPLY()
は応答が届くまで待機します。TPGETANY
と TPGETHANDLE
のいずれかを設定しなければなりません。
TPGETHANDLE
TPGETRPLY()
は COMM-HANDLE
によって示される通信ハンドルを使用し、その COMM-HANDLE
に対応する応答があればそれを返します。応答が存在しなければ、TPGETRPLY()
は応答が届くまで待機します。TPGETANY
と TPGETHANDLE
のいずれかを設定しなければなりません。
TPNOCHANGE
DATA-REC
のタイプは変更されなくなります。つまり、応答レコードのタイプおよびサブタイプは、それぞれ REC-TYPE
および SUB-TYPE
と一致しなければなりません。TPNOCHANGE
または TPCHANGE
のいずれかが設定されていなければなりません。
TPCHANGE
REC-TYPE
および SUB-TYPE
と異なっています。TPNOCHANGE
または TPCHANGE
のいずれかが設定されていなければなりません。
TPNOBLOCK
TPGETRPLY()
は、応答が送られてくるまで待機しません。応答が取り出せる状態であれば、TPGETRPLY()
はその応答を取り込み、終了します。TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPBLOCK
TPBLOCK
が設定されていて、データも取り出せる状態にない場合、呼び出し側は応答が到着するまで、あるいはタイムアウト (トランザクションまたはブロッキング) が発生するまでブロックされます。TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPNOTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPSIGRSTRT
TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
TPNOSIGRSTRT
TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
特に説明がなければ、COMM-HANDLE
は対応する応答が受信された後は、無効になります。
TPGETRPLY()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。TP-STATUS
に TPOK()
または TPESVCFAIL()
が設定されると、TPSTATUS-REC
内の APPL-RETURN-CODE
に TPRETURN()
の一部として送信されたアプリケーション定義の値が入ります。着信メッセージの大きさが入力時に LEN
に指定されたより大きい場合、TPTRUNCATE()
が設定され、LEN
分のデータのみが DATA-REC
に移動されて残りのデータは破棄されます。
次の条件が発生すると、TPGETRPLY()
は異常終了し、TP-STATUS
を以下のように設定します。TPGETHANDLE
が設定されている場合は、特に明記されないかぎり、COMM-HANDLE
は無効になります。TPGETANY
が設定されていると、COMM-HANDLE
は障害を起こした応答の通信ハンドルを示します。応答を取り出せるようになる前にエラーが発生した場合には、COMM-HANDLE
は 0
です。また、特に明記しない限り、この異常終了は呼び出し側のトランザクションには影響しません。
TPEINVAL
]
TPEOTYPE
]
TPNOCHANGE
が設定されていて、REC-TYPE
と SUB-TYPE
が、そのサービスから送られた応答のタイプおよびサブタイプと一致しません。DATA-REC
も TPTYPE-REC
も変更されません。呼び出し側の現在のトランザクションのために応答が受信された場合は、そのトランザクションには中途終了マークが付けられます。
TPEBADDESC
]
TPETIME
]
TPBLOCK
と TPTIME
の両方が指定された場合にのみ発生します。いずれの場合でも、DATA-REC
も TPTYPE-REC
も変更されません。COMM-HANDLE
は、呼び出し側がトランザクション モードでなければ (そして、TPGETHANDLE
が設定されている場合) そのまま有効です。
TPETIME
が発生します。ただし、例外が 1 つあります。例外は、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションのために送信されない要求 (つまり、TPNOTRAN
、TPNOBLOCK
、および TPNOREPLY
が設定された状態で TPACALL()
が呼び出される場合) です。
TX_ROLLBACK_ONLY
状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME
で異常終了します (前の段落で説明した例外を除く)。
TPESVCFAIL
]
TPFAIL()
を設定して TPRETURN()
を呼び出しました。これは、アプリケーション レベルの障害です。サービスの応答の内容は (送信された場合)、DATA-REC
に入ります。APPL-RETURN-CODE
には、TPRETURN()
の一部として送信されたアプリケーション定義の値が入ります。応答が呼び出し側のトランザクションのために受信された場合、トランザクションには中途終了マークが付けられます。トランザクションがタイムアウトになったかどうかにかかわらず、トランザクションがアボートされる前に有効な通信は、TPNOREPLY
、TPNOTRAN
、および TPNOBLOCK
を設定した TPACALL()
の呼び出しのみです。
TPESVCERR
]
TPRETURN()
あるいは TPFORWAR()
で完了する際にエラーを検出しました (たとえば、誤った引数が渡された場合など)。このエラーが発生すると、応答データは返されません (つまり、DATA-REC
も TPTYPE-REC
も変更されません)。応答が呼び出し側のトランザクションのために受信された場合、トランザクションには中途終了マークが付けられます。トランザクションがタイムアウトになったかどうかにかかわらず、トランザクションがアボートされる前に有効な通信は、TPNOREPLY
、TPNOTRAN
、および TPNOBLOCK
を設定した TPACALL()
の呼び出しのみです。
TPEBLOCK
]
TPGOTSIG
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPACALL(3cbl)
、TPCANCEL(3cbl)
、TPRETURN(3cbl)
01
TPTYPE-REC
.
COPY TPTYPE.
01DATA-REC
.
COPY User data.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPGETUNSOL" USINGTPTYPE-REC
DATA-REC
TPSTATUS-REC
.
TPGETUNSOL()
は、TPBROADCAST()
または TPNOTIFY()
によって送られた非請求メッセージを取得します。このルーチンは、非請求メッセージ ハンドラからのみ呼び出し可能です。
正常終了時には、DATA-REC
に移動された実際のバイト数が TPTYPE_REC
内の LEN
に入ります。TPTYPE-REC
内の REC-TYPE
および SUB-TYPE
にはそれぞれデータのタイプおよびサブタイプが入ります。メッセージが DATA-REC
より大きい場合は、DATA-REC
にはこのレコードに入るバイト数分のみが入ります。メッセージの残りは破棄され、TPTRUNCATE()
が設定されます。正常終了時に LEN
が 0
である場合は、メッセージにはデータ部がなく、DATA-REC
は変更されていません。
TPGETUNSOL()
の正常終了時には、TP-STATUS
に [TPOK
] が設定されます。着信メッセージの大きさが入力時に LEN
に指定されたより大きい場合、TPTRUNCATE()
が設定され、LEN
分のデータのみが DATA-REC
に移動されて残りのデータは破棄されます。
次の条件が発生すると、TPGETUNSOL()
は異常終了し、TP-STATUS
に次の値を設定します。
TPEINVAL
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
01
TPPRIDEF-REC
.
COPY TPPRIDEF.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPGPRIO" USINGTPPRIDEF-REC
TPSTATUS-REC
.
TPGPRIO()
は、最後に送信あるいは受信した要求の優先順位を返します。優先順位の範囲は 1 から 100 までです。最高優先順位は 100 です。TPGPRIO()
は TPCALL()
または TPACALL()
(また、キュー機能がインストールされている場合は TPENQUEUE()
あるいは TPDEQUEUE()
) の後で呼び出すことができ、返される優先順位は送信された要求のものです。また、TPGPRIO()
はサービス ルーチン内から呼び出して、呼び出されたサービスがどの優先順位で送られたかを明らかにします。TPGPRIO()
は何回でも呼び出すことができ、次の要求が送られるまでは同じ値を返します。
会話プリミティブは優先順位と関連付けられていないので、TPSEND()
や TPRECV()
を発行しても、TPGPRIO()
が返す優先順位には影響しません。また、会話サービス ルーチンの場合も、TPCALL()
や TPACALL()
がそのサービス内から出されないかぎり、優先順位は関連付けられません。
TPGPRIO()
の正常終了時には、TP-STATUS
に [TPOK
] が設定され、要求の優先順位が TPPRIDEF-REC
内の PRIORITY
に返されます。
次の条件が発生すると、TPGPRIO()
は異常終了し、TP-STATUS
に次の値を設定します。
TPENOENT
]
TPGPRIO()
が呼び出されましたが、(TPCALL()
または TPACALL()
を介して) 何の要求も送信されなかったか、要求が送られなかった会話サービスの中で TPGPRIO() が呼び出されました。
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPACALL(3cbl)
、TPCALL(3cbl)
、TPDEQUEUE(3cbl)
、TPENQUEUE(3cbl)
、TPSPRIO(3cbl)
TPINITIALIZE()
- Oracle Tuxedo ATMI アプリケーションに参加する
01
TPINFDEF-REC
.
COPY TPINFDEF.
01USER-DATA-REC
PIC X(any-length).
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPINITIALIZE"TPINFDEF-REC
USER-DATA-REC
TPSTATUS-REC
.
TPINITIALIZE()
は、クライアントが Oracle Tuxedo ATMI のアプリケーションに参加するときに使用します。クライアントが Oracle Tuxedo システムの通信ルーチンまたはトランザクション ルーチンを使用するには、まず Oracle Tuxedo ATMI のアプリケーションに参加する必要があります。TPINITIALIZE()
には、シングルコンテキスト モードとマルチコンテキスト モードの 2 つの動作モードがあります。これについては、後で詳しく説明します。シングルコンテキスト モードでは TPINITIALIE()
の呼び出しは任意選択なので、シングルコンテキストのクライアントは、TPINITIALIZE() を透過的に呼び出す多数の ATMI ルーチン (たとえば、TPACALL()
や TPCALL()
) を呼び出すことによりアプリケーションに参加することもできます。この場合、TPINITIALIZE()
は、TPINFDEF-REC
のメンバーにデフォルト値を使用して呼び出されます。クライアントは TPINITIALIZE()
を直接呼び出すこともでき、その場合は、ここで説明するパラメータを設定することができます。マルチコンテキスト モードが必要な場合、またはアプリケーション認証が必要な場合には、TPINITIALIZE()
を使用する必要があります (「UBBCONFIG(5)」の SECURITY
キーワードの説明を参照)。TPINITIALIZE()
が正常終了した後、クライアントはサービス要求を開始し、トランザクションを定義できます。
シングルコンテキスト モードで TPINITIALIZE()
が 2 回以上呼び出された場合、つまり、クライアントがアプリケーションに参加した後で呼び出された場合は、アクションは何も実行されず、正常終了を示す戻り値が返されます。
TPINFDEF-REC
レコードは、次のようなメンバーで構成されています。
05 USRNAME PIC X(30).
05 CLTNAME PIC X(30).
05 PASSWD PIC X(30).
05 GRPNAME PIC X(30).
05 NOTIFICATION-FLAG PIC S9(9) COMP-5.
88 TPU-SIG VALUE 1.
88 TPU-DIP VALUE 2.
88 TPU-IGN VALUE 3.
05 ACCESS-FLAG PIC S9(9) COMP-5.
88 TPSA-FASTPATH VALUE 1.
88 TPSA-PROTECTED VALUE 2.
05 CONTEXTS-FLAG PIC S9(9) COMP-5.
88 TP-SINGLE-CONTEXT VALUE 0.
88 TP-MULTI-CONTEXTS VALUE 1.
05 DATALEN PIC S9(9) COMP-5.
USRNAME
は呼び出し側を表す名前です。CLTNAME
は、その意味付けがアプリケーション側で定義されているクライアント名です。値 sysclient
は、CLTNAME
フィールド用にシステムによって予約されています。USRNAME
および CLTNAME
フィールドは TPINITIALIZE()
実行時にクライアントと関連付けられ、ブロードキャスト通知と管理統計情報の検索に使用されます。PASSWD
は、アプリケーション パスワードとの認証に使用される非暗号化形式のアプリケーション パスワードです。PASSWD
は 30 文字まで有効です。GRPNAME
は、クライアントをリソース マネージャ グループ名と関連付けるときに使用します。GRPNAME
が SPACES
の場合、クライアントは、リソース マネージャに関連付けられず、デフォルトのクライアント グループになります。
TPINITIALIZE()
には、シングルコンテキスト モードとマルチコンテキスト モードの 2 つの動作モードがあります。シングルコンテキスト モードでは、プロセスは一度に 1 つのアプリケーションに参加できます。シングルコンテキスト モードは、CONTEXTS-FLAG
の TP-SINGLE-CONTEXT
を設定して TPINITIALIZE()
を呼び出すか、TPINITIALIZE()
を暗黙的に呼び出す別の関数を呼び出すことによって指定されます。
シングルコンテキスト モードで TPINITIALIZE()
が 2 回以上呼び出された場合、つまり、クライアントがアプリケーションに参加した後で呼び出された場合は、アクションは何も実行されず、正常終了を示す戻り値が返されます。
マルチコンテキスト モードは、CONTEXTS-FLAG
の TP-MULTI-CONTEXTS
を設定して TPINITIALIZE()
を呼び出すことにより指定されます。マルチコンテキスト モードでは、TPINITIALIZE()
を呼び出すたびに別のアプリケーション関連が作成されます。
アプリケーション関連とは、プロセスと Oracle Tuxedo アプリケーションを関連付けるコンテキストです。クライアントは、複数の Oracle Tuxedo アプリケーションとの関連、または同じアプリケーションとの複数の関連を作成できます。クライアントのすべての関連は、同じリリースの Oracle Tuxedo システムを実行するアプリケーションに対して作成します。また、すべての関連がネイティブ クライアントであるか、すべての関連がワークステーション クライアントでなければなりません。
ネイティブ クライアントの場合、新しい関連の生成元になるアプリケーションは、TUXCONFIG
環境変数の値で決まります。ワークステーション クライアントの場合、新しい関連の生成元になるアプリケーションは、WSNADDR
または WSENVFILE
環境変数の値で決まります。現在の COBOL プロセスのコンテキストは、新しい関連に設定されます。
マルチコンテキスト モードでは、アプリケーションは TPGETCTXT()
を呼び出すことにより現在のコンテキストを表すハンドルを取得し、そのハンドルをパラメータとして TPSETCTXT()
に渡して、特定の COBOL プロセスが動作するコンテキストを設定することができます。
シングルコンテキスト モードとマルチコンテキスト モードを一緒に使用することはできません。アプリケーションでいずれかのモードを選択したら、すべてのアプリケーション関連に対して TPTERM()
を呼び出すまで、TPINITIALIZE()
をほかのモードで呼び出すことはできません。
TPINFDEF-REC
の設定により、クライアント固有の通知機構とシステム アクセスのモードの両方を示すことができます。これらの設定で、アプリケーションのデフォルトの設定を変更することができます。ただし、変更できない場合には、TPINITIALIZE()
はログ ファイルに警告メッセージを記録し、設定を無視して、TPINITIALIZE()
の終了時にアプリケーションのデフォルト設定が TPINFDEF-REC
に返されます。クライアントへの通知の場合、この設定として次のものがあります。
TPU-SIG
TPU-DIP
TPU-IGN
一度にはこのいずれか 1 つのみ使用できます。クライアントが通知方法を選択しない場合、アプリケーションのデフォルトの方法が、TPINITIALIZE()
の終了時に設定されます。
システム アクセス モードの設定の場合、設定として次のものがあります。
TPSA-FASTPATH
TPSA-PROTECTED
一度にはこのいずれか 1 つのみ使用できます。クライアントが通知方法またはシステム アクセス モードを選択しない場合、アプリケーションのデフォルトの方法が、TPINITIALIZE()
の終了時に設定されます。クライアントの通知方法とシステム アクセス モードの詳細については、「UBBCONFIG(5)」を参照してください。
DATALEN
は、サービスに送信されるアプリケーション固有のデータの長さです。アプリケーションが Oracle Tuxedo システムのアプリケーション認証機能を使用しない場合、USRNAME
および CLTNAME
に SPACES
値を使用できます。現時点では、GRPNAME
は SPACES
でなければなりません。このオプションを使用するクライアントは、Oracle Tuxedo システムにおいて次のように定義されます。USRNAME
、CLTNAME
、および GRPNAME
はデフォルト値、デフォルト設定で、アプリケーション データは得られません。
TPINITIALIZE()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。異常終了時には、TPINITIALIZE()
は呼び出し側プロセスのコンテキストを変更せず、-1
を返して、TP-STATUS
にエラー条件を示す値を設定します。
TPINITIALIZE()
は異常終了時には、TP-STATUS
に次の値を設定します。
TPEINVAL
]
TPENOENT
]
TPEPERM
]
TPEPROTO
]
TPINITIALIZE()
の呼び出し方法が不適切です。たとえば、(a) 呼び出し側がサーバである場合、(b) シングルコンテキスト モードで TP-MULTI-CONTEXTS
設定が指定された場合、または (c) マルチコンテキスト モードで TP-MULTI-CONTEXTS
設定が指定されなかった場合などがあります。
TPESYSTEM
]
TPEOS
]
TPINITIALIZE()
に記述されているインタフェースは、UNIX システムおよび MS-DOS オペレーティング システム上でサポートされています。ただし、シグナル ベースの通知方法は、MS-DOS ではサポートされていません。TPINITIALIZE()
の実行時にこの通知方法が選択されると、USERLOG()
メッセージが生成され、通知方法は自動的にディップ インに設定されます。
TUXCONFIG
TPINITIALIZE()
内で使用されます。この変数は、クライアントの接続先になるアプリケーションを示します。なお、この環境変数は、TPINITIALIZE()
が呼び出されるときにのみ参照されます。これ以降の呼び出しには、アプリケーション コンテキストが使用されます。
WSENVFILE
TPINITIALIZE()
内で使用されます。この変数には、環境変数の設定条件を収めたファイルを指定しますが、この設定は呼び出し側の環境で行うようにします。ワークステーション クライアントに必要とされる環境変数の設定に関する詳細については、「compilation(5)」を参照してください。なお、このファイルは、TPINITIALIZE()
が呼び出されるとき (その前ではなく) にのみ処理されます。
WSNADDR
TPINITIALIZE()
内で使用されます。これは、アプリケーションをアクセスするときに使用されるワークステーション リスナ プロセスのネットワーク アドレスを示します。この変数はワークステーション クライアントの場合は必須ですが、ネイティブ クライアントの場合は無視されます。
"//host.name:port_number"
"//#.#.#.#:port_number"
hostname
のアドレスを見つけます。hostname
はローカル マシンでなければならず、ローカル ネーム解決機能は、ローカル マシンのアドレスへ hostname
を解決しなければなりません。
#.#.#.#
」はドットで区切った 10 進数の形式です。ドットで区切った 10 進数の形式では、各 #
は 0 から 255 までの数でなければなりません。このドットで区切った 10 進数は、ローカル マシンの IP アドレスを表現します。
port_number
はドメイン プロセスが着信要求をリスンする TCP ポート番号です。port_number
は 0 から 65535 の間の数字または名前です。port_number
が名前の場合は、ローカル マシンのネットワーク サービス データベースになければなりません。
NETWORKS
セクションの NLSADDR
パラメータに指定された値と同じでなければなりません。
WSNADDR
アドレス用のコンマで区切られたパス名のリストを指定すると、複数のアドレスを指定することができます。接続が確立するまで順番にアドレス指定が試みられます。アドレス リストのメンバーは、どれでもパイプで区切られたネットワーク アドレスのかっこ付きのグループとして指定することができます。次に例を示します。
WSNADDR="(//m1.acme.com:3050|//m2.acme.com:3050),//m3.acme.com:3050"
set WSNADDR=(//m1.acme.com:3050^|//m2.acme.com:3050),//m3.acme.com:3050
|
) は Windows では特殊文字と見みなされるため、コマンドラインで指定する際は、その前に Windows 環境でのエスケープ文字のカレット (^) を前に付ける必要があります。ただし、WSNADDR
が envfile で定義される場合、Oracle Tuxedo システムは tuxgetenv(3c) 関数を通して、WSNADDR
定義の値を取得します。この場合、パイプ記号 (|
) は特殊文字と見なされないので、カレット (^
) を使用する必要はありません。
WSFADDR
TPINITIALIZE()
内で使用されます。この変数は、ワークステーション クライアントがワークステーション リスナまたはワークステーション ハンドラに接続するときに使用するネットワーク アドレスを指定します。この変数は、WSFRANGE
変数とともに、ワークステーション クライアントがアウトバウンド接続を行う前にバインドしようとする TCP/IP ポートの範囲を決定します。このアドレスには、TCP/IP アドレスを指定する必要があります。TCP/IP アドレスのポート部分は、ワークステーション クライアントによってバインドされる一連の TCP/IP ポートのベース アドレスを表します。WSFRANGE
変数は、範囲の大きさを指定します。たとえば、このアドレスが //mymachine.bea.com:30000
で WSFRANGE
が 200 の場合、この LMID
からアウトバウンド接続を試みるネイティブ プロセスはすべて、mymachine.bea.com
30000 から 30200 の間のポートをバインドします。この変数を設定しないと、空の文字列が使用され、オペレーティング システムはローカル ポートをランダムに選択します。
WSFRANGE
TPINITIALIZE()
内で使用されます。この変数は、ワークステーション クライアント プロセスが、アウトバウンド接続を行う前にバインドを試みる TCP/IP ポートの範囲を指定します。WSFADDR
パラメータは、範囲のベース アドレスを指定します。たとえば、WSFADDR
パラメータが //mymachine.bea.com:30000
に設定され、WSFRANGE
が 200 に設定されると、この LMID
からアウトバウンド接続を試みるネイティブ プロセスはすべて、mymachine.bea.com
30000 から 30200 の間のポートにバインドします。有効範囲は 1 から 65535 までです。デフォルト値は 1 です。
WSDEVICE
TPINITIALIZE()
内で使用されます。これは、ネットワークのアクセス時に使用するデバイス名を示します。この変数はワークステーション クライアントが使用し、ネイティブ クライアントの場合は無視されます。なお、ソケットや NetBIOS などトランスポート レベルのネットワーク インタフェースはデバイス名を必要としません。このようなインタフェースによってサポートされているワークステーション クライアントは、WSDEVICE
を指定する必要はありません。
WSTYPE
TPINITIALIZE()
内で使用されます。この変数はワークステーション クライアントの場合は省略可能で、ネイティブ クライアントの場合は無視されます。
WSRPLYMAX
TPINITIALIZE()
によって使用され、アプリケーション応答をファイルにダンプする前のバッファリングに使用するコア メモリの最大容量を設定します。このパラメータのデフォルトの値は、インスタンス化の方法に応じて異なります。詳細については、該当するプログラマ ガイドを参照してください。
TMMINENCRYPTBITS
TMMAXENCRYPTBITS
シグナル ベースの通知方法は、マルチコンテキスト モードでは使用できません。また、シグナル ベースの通知方法を選択するクライアントは、シグナルに関する制約から、システムからシグナルを受け取ることはできません。クライアントがシグナルを受け取ることができない場合、システムは、選択したクライアントへの通知方法をディップ インに切り替えるログ メッセージを生成し、クライアントはそれ以降ディップ イン通知を介して通知を受けます。通知方法の詳細については、「UBBCONFIG(5)」の RESOURCES
セクションの NOTIFY
パラメータの説明を参照してください。
クライアントのシグナル通知は、常にシステムによって行われるので、元の通知呼び出しがどこで行われるかにかかわらず、通知の形態は一貫しています。したがって、シグナル ベースの通知を使用するには次の条件が必要です。
アプリケーション管理者の ID は、そのアプリケーションのコンフィグレーション ファイルで識別されます。
クライアントにシグナル ベースの通知を選択すると、ある種の ATMI 呼び出しは正常に実行できないことがあります。このとき、TPSIGRSTRT
の指定がない場合、非請求メッセージを受け取るため、TPGOTSIG
が返されます。
TPGETCTXT(3cbl)
、TPSETCTXT(3cbl)
、TPTERM(3cbl)
TPKEYCLOSE()
- 以前にオープンされたキー ハンドルのクローズ
01TPKEYDEF-REC
.
COPY TPKEYDEF.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPKEYCLOSE" USINGTPKEYDEF-REC
TPSTATUS-REC
.
TPKEYCLOSE()
は以前にオープンされたキー ハンドル、およびそれに関連するすべてのリソースを解放します。プリンシパルのプライベート キーなどの重要情報はすべて、メモリから消去されます。
呼び出し側プロセスは TPKEYDEF-REC
内の KEY-HANDLE
を指定する必要があります。KEY-HANDLE
は、事前の TPKEYOPEN()
呼び出しで返されるキー識別子です。
TPKEYCLOSE()
は正常終了時には、TPSTATUS-REC
内の TP-STATUS
に [TPOK
] を設定します。
TPKEYCLOSE()
は異常終了時には、TPSTATUS-REC
内の TP-STATUS
に次のいずれかの値を設定します。
TPEINVAL
]
TPESYSTEM
]
TPKEYGETINFO(3cbl)
、TPKEYOPEN(3cbl)
、TPKEYSETINFO(3cbl)
TPKEYGETINFO()
- キー ハンドルに関連付けられている情報の獲得
01TPKEYDEF-REC
.
COPY TPKEYDEF.
01ATTVALUE-REC.
COPY user data
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPKEYGETINFO" USINGTPKEYDEF-REC
ATTVALUE-REC
TPSTATUS-REC
.
TPKEYGETINFO()
は、キー ハンドルについての情報を報告します。キー ハンドルは、特定のプリンシパルのキーおよびそれに関連付けられている情報を表します。
呼び出し側プロセスは TPKEYDEF-REC
内の KEY-HANDLE
を設定する必要があります。KEY-HANDLE は、事前の TPKEYOPEN()
呼び出しで返されるキー識別子です。
情報が必要な属性は、TPKEYDEF-REC
内の ATTRIBUTE-NAME
によって識別されます。属性名には、SPACES
または LOW-VALUES
を埋め込むことができます。一部の属性は暗号サービス プロバイダ固有のものですが、以下に示す属性は、すべてのプロバイダによってサポートされています。
次の表に、デフォルトの公開鍵実装でサポートされる ASN.1 DER アルゴリズム オブジェクト識別子を示します。
指定された属性に関連付けられている情報は、ユーザ定義の ATTVALUE-REC
に格納され、末尾には SPACES
が埋められます。この位置に格納できる最大データ量は、TPKEYDEF-REC
内の ATTRIBUTE-LEN
の呼び出しで指定します。
TPKEYGETINFO()
が完了すると、ATTRIBUTE-LEN
には実際に返されたデータの大きさが設定されます (埋め込み値を除く)。返されるべきバイト数が ATTRIBUTE-VALUE-LEN
を超える場合、TPKEYGETINFO()
は (TPELIMIT
エラー コードを示して) 異常終了し、必要なスペースを ATTRIBUTE-VALUE-LEN
に設定します。
TPKEYGETINFO()
は正常終了時には、TPSTATUS-REC
内の TP-STATUS
に [TPOK
] を設定します。
TPKEYGETINFO()
は異常終了時には、TPSTATUS-REC
内の TP-STATUS
に次のいずれかの値を設定します。
TPEINVAL
]
TPESYSTEM
]
TPELIMIT
]
TPENOENT
]
TPKEYCLOSE(3cbl)
、TPKEYOPEN(3cbl)
、TPKEYSETINFO(3cbl)
TPKEYOPEN()
- デジタル署名の生成、メッセージの暗号化または復号化のためのキー ハンドルのオープン
01TPKEYDEF-REC
.
COPY TPKEYDEF.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPKEYOPEN" USINGTPKEYDEF-REC
TPSTATUS-REC
.
TPKEYOPEN()
によって、呼び出し側でキー ハンドルを利用できるようになります。キー ハンドルは、特定のプリンシパルのキーおよびそれに関連付けられている情報を表します。
キーは、以下に示す目的のうち、1 つまたは複数の目的に使用できます。
プリンシパル名と TPKEY-SIGNATURE
および TPKEY-AUTOSIGN
を設定して TPKEYOPEN()
を呼び出すと、プリンシパルの公開鍵のハンドルが返され、AUTOSIGN
モードで署名を生成することが可能になります。公開鍵ソフトウェアは、メッセージが送信される直前に、デジタル署名を生成してメッセージに添付します。
署名の検証では TPKEYOPEN()
を呼び出す必要はありません。検証プロセスは、署名を検証するためにデジタル署名付きメッセージに付属しているデジタル証明書で指定されている公開鍵を使用します。
プリンシパル名と TPKEY-ENCRYPT
および TPKEY-AUTOENCRYPT
を設定して TPKEYOPEN()
を呼び出すと、(プリンシパルのデジタル証明書を介して) プリンシパルの公開鍵のハンドルが返され、AUTOENCRYPT
モードで暗号化することが可能になります。公開鍵ソフトウェアは、メッセージが送信される直前に、メッセージを暗号化し、メッセージに暗号化エンベロープを添付します。暗号化エンベロープにより、受信側プロセスはメッセージを復号化することができます。
プリンシパル名と TPKEY-DECRYPT
を設定して TPKEYOPEN()
を呼び出すと、プリンシパルのプライベート キーおよびデジタル証明書のハンドルが返されます。
TPKEYOPEN()
によって返されるキー ハンドルは、TPKEYDEF-REC
内の KEY-HANDLE
に格納されます。
呼び出し側プロセスは TPKEYDEF-REC
内の PRINCIPAL-NAME
を設定する必要があります。PRINCIPAL-NAME は、キーのオーナーの ID を指定します。この名前の末尾には SPACES
または LOW-VALUES
を埋め込むことができます。PRINCIPAL-NAME
がすべて SPACES
か LOW-VALUES
の場合、デフォルトのアイデンティティが使用されます。デフォルトの ID は、現在のログイン セッション、現在のオペレーティング システム アカウント、またはローカル ハードウェア デバイスなどの別の属性に基づいて決定されます。
呼び出し側プロセスは、TPKEYDEF-REC
内の LOCATION
を設定しなければならないことがあります。LOCATION はキーのオーナーの ID の位置を指定します。プロバイダがこのフィールドを要求していない場合は、このフィールドに SPACES
か LOW-VALUES
を入力できます。
PRINCIPAL-NAME
のアイデンティティを認証するために、パスワードまたはパス フレーズなどの証明材料が要求されることがあります。必要な場合は、証明材料を TPKEYDEF-REC
内の IDENTITY-PROOF
に格納します。必要ない場合、このフィールドには SPACES
か LOW-VALUES
を入力できます。
証明材料の長さ (バイト単位) は、TPKEYDEF-REC
内の PROOF-LEN
で指定されます。PROOF-LEN
が 0 の場合、IDENTITY-PROOF
は末尾に SPACES
か LOW-VALUES
を埋め込まれた文字列であるとみなされます。この場合、末尾の SPACES
や LOW-VALUES
は証明材料の一部とはみなされません。
ローカル マシンのコンフィグレーションおよび動作環境に基づいて、暗号サービス プロバイダを選択しなければならないことがあります。暗号サービス プロバイダを選択する場合は、必要なプロバイダ名を TPKEYDEF-REC
内の CRYPTO-PROVIDER
に設定します。暗号サービス プロバイダを選択しない場合、このフィールドに SPACES
か LOW-VALUES
を入力すると、デフォルトのプロバイダが選択されます。
キーの動作モードに必要なキー アクセスのタイプは、TPKEYDEF-REC
に次の設定を 1 つまたは複数指定することにより決定されます。
TPKEY-SIGNATURE
:
TPKEY-AUTOSIGN
:
TPKEY-ENCRYPT
:
TPKEY-AUTOENCRYPT
:
TPKEY-DECRYPT
:
これらの設定を組み合わせて、指定することができます。キーが暗号化にのみ使用される場合 (TPKEY-ENCRYPT
および TPKEY-AUTOENCRYPT
)、IDENTITY-PROOF
は不要です。
TPKEYOPEN()
は正常終了時には、TPSTATUS-REC
内の TP-STATUS
に [TPOK
] を設定します。また、このキーを表す値が TPKEYDEF-REC
内の KEY-HANDLE
に設定されます。この値は、TPKEYGETINFO()
などほかの関数で使用されます。
TPKEYOPEN()
は異常終了時には、TPSTATUS-REC
内の TP-STATUS
に次のいずれかの値を設定します。
TPEINVAL
]
TPEPERM
]
TPESYSTEM
]
TPKEYCLOSE(3cbl)
、TPKEYGETINFO(3cbl)
、TPKEYSETINFO(3cbl)
TPKEYSETINFO()
- キー ハンドルに関連付けるオプション パラメータを設定する
01TPKEYDEF-REC
.
COPY TPKEYDEF.
01 ATTVALUE-REC.
COPY user data
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPKEYSETINFO" USINGTPKEYDEF-REC
ATTVALUE-REC
TPSTATUS-REC
.
TPKEYSETINFO()
は、キー ハンドルの省略可能な属性パラメータを設定します。キー ハンドルは、特定のプリンシパルのキーおよびそれに関連付けられている情報を表します。
情報を変更するキーは、TPKEYDEF-REC
内の KEY-HANDLE
で識別されます。KEY-HANDLE
は、事前の TPKEYOPEN()
呼び出しで返されるキー識別子です。
情報を変更する対象の属性は、TPKEYDEF-REC
内の ATTRIBUTE-NAME
で識別されます。属性名には、SPACES
または LOW-VALUES
を埋め込むことができます。一部の属性は暗号サービス プロバイダ固有のものですが、「TPKEYGETINFO(3cbl)
」リファレンス ページで示す基本的属性は、すべてのプロバイダでサポートされる必要があります。
ユーザ定義された ATTVALUE-REC
の値は ATTRIBUTE-NAME
に関連付けられます。TPKEYSETINFO()
が正常に終了すると、ATTVALUE-REC
の情報が暗号サービス プロバイダが定義する方法で格納または処理されます。ATTVALUE-REC
のデータの内容が自己記述型の場合、TPKEYDEF-REC
内の ATTRIBUTE-VALUE-LEN
は無視されます (0 でかまいません)。それ以外の場合、ATTRIBUTE-VALUE-LEN
には ATTVALUE-REC
のデータ長を指定する必要があります。
TPKEYSETINFO()
は正常終了時には、TPSTATUS-REC
内の TP-STATUS
に [TPOK
] を設定します。
TPKEYSETINFO()
は異常終了時には、TPSTATUS-REC
内の TP-STATUS
に次のいずれかの値を設定します。
TPEINVAL
]
TPESYSTEM
]
TPELIMIT
]
TPENOENT
]
TPKEYCLOSE(3cbl)
、TPKEYGETINFO(3cbl)
、TPKEYOPEN(3cbl)
TPNOTIFY()
- クライアント識別子により通知を送信する
01
TPSVCDEF-REC
.
COPY TPSVCDEF.
01TPTYPE-REC
.
COPY TPTYPE.
01DATA-REC
.
COPY User data.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPNOTIFY" USINGTPSVCDEF-REC
TPTYPE-REC
DATA-REC
TPSTATUS-REC
.
TPNOTIFY()
は、サーバが個々のクライアントに非請求メッセージを送信できるようにします。
TPSVCDEF-REC
内の CLIENTID
には、以前のあるいは現在のサービス呼び出しの TPSVCDEF-REC
から保存されたクライアント識別子が入ります。
DATA-REC
は、送信するメッセージであり、TPTYPE-REC
内の LEN
は、送信する DATA-REC
の大きさを指定します。ただし、DATA-REC
が長さの指定を必要としないタイプのレコードの場合は、LEN
は無視されます (0
でかまいません)。TPTYPE-REC
内の REC-TYPE
が SPACES
の場合は、DATA-REC
および LEN
は無視され、要求はデータ部なしで送信されます。
TPNOTIFY()
が正常終了した場合、メッセージはシステムに渡され、指定されたクライアントに送信されます。TPACK()
が設定されていた場合、正常終了は、クライアントがメッセージを受信したことを意味します。さらに、クライアントが非請求メッセージ ハンドラに登録している場合は、ハンドラが呼び出されます。
次に、TPSVCDEF-REC
の有効な設定の一覧を示します。
TPNOBLOCK
TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPBLOCK
TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPNOTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPSIGRSTRT
TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
TPNOSIGRSTRT
TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
TPACK
TPNOACK
TPNOTIFY()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。
次の条件が発生すると、TPNOTIFY()
は異常終了し、TP-STATUS
に次の値を設定します。
TPEINVAL
]
TPENOENT
]
TPETIME
]
TPBLOCK
と TPTIME
が指定された場合、(b) TPACK
と TPTIME
が指定された場合 (この場合、承認は受信されない) に発生します。
TPEBLOCK
]
TPGOTSIG
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPERELEASE
]
TPBROADCAST(3cbl)
、TPCHKUNSOL(3cbl)
、TPINITIALIZE(3cbl)
、TPSETUNSOL(3cbl)
、TPTERM(3cbl)
TPOPEN()
- Oracle Tuxedo ATMI のリソース マネージャのオープン
01
TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPOPEN" USING TPSTATUS-REC
.
TPOPEN()
は、呼び出し側がリンクされるリソース マネージャをオープンします。呼び出し側には、多くとも 1 つのリソース マネージャしかリンクできません。このルーチンはリソース マネージャ固有の open()
呼び出しの代わりに使用するもので、これによりサービス ルーチンから、移植性を損なう可能性のある呼び出しをなくすことができます。リソース マネージャは初期化の内容がそれぞれで異なるため、個々のリソース マネージャをオープンするために必要な情報をコンフィグレーション ファイルに記述します。
リソース マネージャがすでにオープンされている場合 (つまり、TPOPEN()
を 2 回以上呼び出した場合)、何も処理は行われず、正常終了を示すコードが返されます。
TPOPEN()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。リソース マネージャがオープンできなかった理由に関する詳しい情報は、そのリソース マネージャに独自の方法で照会することで得ることができます。ただし、リソース マネージャのエラーの正確な内容を判別するための呼び出しを使用すると、移植性が損なわれます。
次の条件が発生すると、TPOPEN()
は異常終了し、TP-STATUS
に次の値を設定します。
TPERMERR
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
01
TPEVTDEF-REC
.
COPY TPEVTDEF.
01TPTYPE-REC
.
COPY TPTYPE.
01DATA-REC
.
COPY User data.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPPOST" USINGTPEVTDEF-REC
TPTYPE-REC
DATA-REC
TPSTATUS-REC
.
呼び出し側は、イベントおよび関連データを通知するために TPPOST()
を使用します。イベントの名前は TPEVTDEF-REC
の EVENT-NAME
で指定され、ポストされるデータは DATA-REC
に含まれます。通知されるイベントおよびそのデータは、EVENT-NAME
がそのサブスクリプション条件を満たし、DATA-REC
がその省略可能なフィルタ規則に適合するすべてのサブスクライバに対し、Oracle Tuxedo のイベント ブローカによってディスパッチされます。
EVENT-NAME
の文字長は最大 31 文字で、SPACES
であってはなりません (スペースで埋めることはできません)。また、ドット (「.」) は Oracle Tuxedo システムによって定義されるイベントの頭文字として使用されるため、EVENT-NAME
の最初の文字にドットを使用することはできません。
DATA-REC
はポストされるレコードであり、そのタイプを指定することができます。イベントとともにポストされる DATA-REC
のデータ長は、TPTYPE-REC
の LEN
で指定されます。ただし、DATA-REC
が長さの指定を必要としないタイプのレコードである場合 LEN
は無視されます (0 でかまいません)。DATA-REC
がデータ長を指定する必要のあるタイプのレコードである場合は、LEN
を 0 にセットすることはできません (0 にセットした場合はデータはポストされません)。TPTYPE-REC
の REC-TYPE
が SPACES
の場合は、DATA-REC
と LEN
は無視され、データをともなわずにイベントだけがポストされます。
TPPOST()
をトランザクション内で使用する場合、トランザクションの境界は、イベント ブローカによって通知されるサーバおよび安定ストレージのメッセージ キュー、またはそのいずれかを含むように拡張されます。トランザクションによるポストでは、ポストされたイベントを受け取ったことがポスト元のトランザクションに通知される場合 (サーバやキューなど) と、通知されない場合 (クライアントなど) があります。
ポスト元がトランザクション内にあり、TPTRAN
が設定されると、通知されるイベントはトランザクション モードでイベント ブローカに渡されます。これは、イベント ブローカがイベントをポスト元のトランザクションの一部としてディスパッチできるようにするためです。ブローカは、サブスクリプションの実行時に TPEVTDEF-REC
の TPEVTRAN
をセットしたサービス ルーチンや安定記憶キューのサブスクリプションに対してのみトランザクション イベント通知を送出します。クライアント通知、およびサブスクリプション時に TPEVTDEF-REC
の TPEVNOTRAN
を設定したサービス ルーチンや安定ストレージ キューのサブスクリプションも、イベント ブローカによってディパッチされますが、これらはポスト側プロセスのトランザクションの一部としては処理されません。
次に、TPEVTDEF-REC
の有効な設定の一覧を示します。
TPNOTRAN
TPNOTRAN
または TPTRAN
のいずれかが設定されていなければなりません。
TPTRAN
TPNOTRAN
または TPTRAN
のいずれかが設定されていなければなりません。
TPNOREPLY
TPPOST()
に対し、イベント ブローカが EVENT-NAME
に対するすべてのサブスクリプションを処理するまで待ってから戻る必要はないことを知らせます。TPNOREPLY
を設定すると、TPPOST()
が正常終了するかどうかにかかわらず、TPEVTDEF-REC
の EVENT-COUNT
は 0 に設定されます。呼び出し側がトランザクション モードにある場合は、TPTRAN
も設定するときには、この設定は使用できません。TPNOREPLY
または TPREPLY
のいずれかが設定されていなければなりません。
TPREPLY
TPPOST()
に対し、すべてのサブスクリプションが処理されてから戻るよう指示します。TPREPLY
を設定すると、ルーチンは正常終了時には [TPOK
] を返し、EVENT-NAME
に関してイベント ブローカによってデイスパッチされたイベント通知の数が TPEVTDEF-REC
の EVENT-COUNT
に設定されます。呼び出し側がトランザクション モードにあり、TPTRAN
がセットされている場合は、このフラグを設定する必要があります。TPNOREPLY
または TPREPLY
のいずれかが設定されていなければなりません。
TPNOBLOCK
TP-STATUS
は [TPEBLOCK
] に設定されます。TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPBLOCK
TPBLOCK
がセットされ、ブロッキング条件が存在する場合は、呼び出し側はブロッキング条件が消失するか、またはタイムアウト (トランザクション タイムアウト、またはブロッキング タイムアウト) が発生するまでブロックします。TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPNOTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPSIGRSTRT
TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
TPNOSIGRSTRT
TP-STATUS
は [TPGOTSIG
] にセットされます。TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
TPPOST()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。また、EVENT-COUNT
にはイベント ブローカが EVENT-NAME
に関してディスパッチしたイベント通知 (つまり、そのイベント表現が EVENT-NAME
に対して有効であると評価され、かつそのフィルタ規則が DATA-REC
に対して有効であると評価されたサブスクリプションのためのポスト) の数が入ります。終了時に TP-STATUS
が [TPESVCFAIL
] に設定された場合、EVENT-COUNT
には、イベント ブローカが EVENT-NAME
に関してディスパッチした非トランザクション イベント通知の数が入ります。
次の条件が発生すると、TPPOST()
は異常終了し、TP-STATUS
に次のいずれかの値を設定します (特に記述した場合を除いては、エラーが呼び出し側のトランザクションに影響を及ぼすことはありません)。
TPEINVAL
]
TPENOENT
]
TPETRAN
]
TPTRAN
が設定され、TPPOST()
がトランザクション伝播をサポートしないイベント ブローカにコンタクトしました。つまり、TMUSREVT(5) が、トランザクションをサポートする Oracle Tuxedo ATMI グループで実行されていません。
TPETIME
]
TPBLOCK
と TPTIME
の両方が指定された場合にのみ発生します。
TPETIME
が発生します。ただし、例外が 1 つあります。例外は、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションのために送信されない要求 (つまり、TPNOTRAN
、TPNOBLOCK
、および TPNOREPLY
が設定された状態で TPACALL()
が呼び出される場合) です。
TPPOST()
がトランザクション内部で失敗すると、そのトランザクションは TX_ROLLBACK_ONLY
状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME
で異常終了します (前の段落で説明した例外を除く)。
TPESVCFAIL
]
EVENT-COUNT
には、イベント ブローカが EVENT-NAME
に関してディスパッチした非トランザクション イベント通知の数が入ります。トランザクションのポスティングの結果はトランザクション終了時にアボートされるため、カウントされません。なお、トランザクションがタイムアウトしないかぎり、通信はトランザクションがアボートするまで継続され、呼び出し側のトランザクションのためになされた作業はトランザクションが完了する時点でアボートされます (つまり、以降のやりとりで何らかの結果が得られる場合には、TPNOTRAN
を設定しておく必要があります)。
TPEBLOCK
]
TPGOTSIG
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPSUBSCRIBE(3cbl)
、TPUNSUBSCRIBE(3cbl)
、EVENTS(5), TMSYSEVT(5)、TMUSREVT(5)
01
TPSVCDEF-REC
.
COPY TPSVCDEF.
01TPTYPE-REC
.
COPY TPTYPE.
01DATA-REC
.
COPY User data.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPRECV" USINGTPSVCDEF-REC
TPTYPE-REC
DATA-REC
TPSTATUS-REC
.
TPRECV()
は、別のプログラムからオープン接続を介してデータを受け取るときに使用します。COMM-HANDLE
は、データを受け取るオープン接続を指定します。COMM-HANDLE
は、TPCONNECT()
または TPSVCSTART()
から返される通信ハンドルです。DATA-REC
は、メッセージが読み込まれる場所を指定し、入力時には LEN
が DATA-REC
に移動される最大バイト数を示します。
正常終了の場合、およびいくつかのイベント タイプの場合、LEN
には DATA-REC
に移動された実際のバイト数が入ります。REC-TYPE
および SUB-TYPE
には、それぞれデータのタイプおよびサブタイプが入っています。メッセージが DATA-REC
より大きい場合は、DATA-REC
にはこのレコードに入るバイト数分のみが入ります。応答の残りは破棄され、TPRECV()
は TPTRUNCATE
を設定します。
正常終了時に LEN
が 0
である場合は、応答にはデータ部がなく、DATA-REC
は変更されていません。入力時に LEN
を 0
にすると、エラーになります。
TPRECV()
は、接続の制御を持たないプログラムしか出せません。
次に、TPSVCDEF-REC
の有効な設定の一覧を示します。
TPNOCHANGE
DATA-REC
のタイプは変更できません。つまり、受信したメッセージのタイプとサブタイプは、それぞれ REC-TYPE
および SUB-TYPE
と一致しなければなりません。TPNOCHANGE
または TPCHANGE
のいずれかが設定されていなければなりません。
TPCHANGE
REC-TYPE
および SUB-TYPE
で指定されているものと異なっていることが可能です。TPNOCHANGE
または TPCHANGE
のいずれかが設定されていなければなりません。
TPNOBLOCK
TPRECV()
はデータが到着するまで待機します。すでにデータが受信できる状態であると、TPRECV()
はデータを取り込んで終了します。TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPBLOCK
TPBLOCK
が設定されていて、データが受信できる状態である場合は、呼び出し側は、データが到着するまでブロックします。TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPNOTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPSIGRSTRT
TPNOSIGRSTRT
TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
COMM-HANDLE
に対してイベントが存在する場合、TPRECV()
は終了し、TP-STATUS
に TPEEVENT()
を設定します。イベントのタイプは、TPEVENT()
に返されます。TPEV-SVCSUCC
、TPEV-SVCFAIL
および TPEV-SENDONLY
イベントとともに、データを受け取ることができます。TPRECV()
の有効なイベントを次に示します。
TPEV-DISCONIMM
TPDISCON()
により即時切断要求を出したこと、または、会話の起動元がまだオープンしている接続について TPRETURN()
または TPCOMMIT()
を出したときにエラーが発生したことを示します。このイベントは、通信エラー (サーバ、マシン、ネットワークの障害など) により接続が切断されたときにも起動元またはその従属側に返されます。これは即時切断通知 (つまり、正常ではなく中途の終了) であるため、処理途中のデータは失われます。2 つのプログラムが同じトランザクションに参加していた場合、そのトランザクションは中途終了マークが付けられます。COMM-HANDLE
は無効になります。
TPEV-SENDONLY
TPEV-SVCERR
TPRETURN()
を出したことを示します。TPRETURN()
によって、サービスが正常に終了できないようなエラーが検出されました。たとえば、不正な引数が TPRETURN()
に渡されていたり、TPRETURN()
が、そのサービスが別の従属側にオープン接続を持っている最中に呼び出されている可能性があります。このイベントの性質上、アプリケーションが定義したデータや戻りコードは返されません。この接続は切断され、COMM-HANDLE
は無効になります。このイベントが、受信側のトランザクションの一部として発生すると、そのトランザクションに中途終了マークが付けられます。
TPEV-SVCFAIL
TPRETURN()
が TPFAIL()
または TPEXIT()
を設定して呼び出されています。TPRETURN()
が呼び出されたときに従属サービスがこの接続の制御権をもっている場合、アプリケーションで定義されている戻り値およびレコードを接続の起動元に渡すことができます。サービス ルーチンの終了処理の一部として、サーバはこの接続を切断しています。このため、COMM-HANDLE
は無効になります。このイベントが、受信側のトランザクションの一部として発生すると、そのトランザクションに中途終了マークが付けられます。
TPEV-SVCSUCC
TPRETURN()
が TPSUCCESS()
を設定して呼び出されています。サービス ルーチンの終了処理の一部として、サーバはこの接続を切断しています。このため、COMM-HANDLE
は無効になります。受信側がトランザクション モードにいる場合、そのトランザクションをコミットする (それが起動元でもある場合) か、中途終了して、サーバが行った作業内容 (トランザクション モードである場合) をコミットあるいは中途終了させます。
TPRECV()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。TP-STATUS
に [TPEEVENT
] が設定され、TPEVENT()
が TPEV-SVCSUCC
または TPEV-SVCFAIL
の場合、APPL-RETURN-CODE
には、TPRETURN()
の一部として送信されたアプリケーション定義の値が入ります。着信メッセージの大きさが入力時に LEN
に指定されたより大きい場合、TPTRUNCATE()
が設定され、LEN
分のデータのみが DATA-REC
に移動されて残りのデータは破棄されます。
次の条件が発生すると、TPRECV()
は異常終了し、TP-STATUS
に次の値を設定します。特に説明がなければ、この障害は呼び出し側のトランザクションには影響しません。
TPEINVAL
]
TPEOTYPE
]
TPNOCHANGE
が設定されているが、REC-TYPE
および SUB-TYPE
が着信メッセージのタイプおよびサブタイプと一致しません。会話が呼び出し側のトランザクションの一部である場合には、着信メッセージが破棄されるので、そのトランザクションに中途終了マークが付けられます。
TPEBADDESC
]
TPETIME
]
TPBLOCK
と TPTIME
の両方が指定された場合にのみ発生します。いずれの場合も、DATAREC
は変更されません。
TPETIME
が発生します。ただし、例外が 1 つあります。例外は、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションのために送信されない要求 (つまり、TPNOTRAN
、TPNOBLOCK
、および TPNOREPLY
が設定された状態で TPACALL()
が呼び出される場合) です。
TX_ROLLBACK_ONLY
状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME
で異常終了します (前の段落で説明した例外を除く)。
TPEEVENT
]
TPEBLOCK
]
TPGOTSIG
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPRETURN()
が呼び出されたとき、サーバは、アプリケーション定義の戻り値および型付きレコードを渡すことができます。この戻り値は APPL-RETURN-CODE
にあり、レコードは、DATA-REC
にあります。
TPCONNECT(3cbl)
、TPDISCON(3cbl)
、TPSEND(3cbl)
TPRESUME()
- グローバル トランザクションを再開する
01TPTRXDEF-REC
.
COPY TPTRXDEF.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPRESUME" USINGTPTRXDEF-REC TPSTATUS-REC
.
TPRESUME()
を使用して、中断されているトランザクションでの作業を再開します。呼び出し側がトランザクションの作業を再開した場合、その作業は TPSUSPEND()
で再度停止させるか、あるいはあとで TPCOMMIT()
または TPABORT()
を利用して完了させる必要があります。
トランザクションの作業を再開する際には、呼び出し側はリンクされたリソース マネージャが (TPOPEN()
を利用して) オープンされていることを確認する必要があります。
TPRESUME()
は、TRANID()
に含まれるグローバル トランザクション識別子に関して、呼び出し側をトランザクション モードに切り替えます。
TPRESUME()
は正常終了時には、[TPOK
] を設定します。
次の条件が発生すると、TPRESUME()
は異常終了し、TP-STATUS
に次の値を設定します。
TPEINVAL
]
TRANID()
に設定された識別子が、実在しないトランザクション (以前に終了したトランザクションやタイムアウトになったトランザクションを含む) のものであるか、または呼び出し側が再開することを認められていないトランザクションのものです。トランザクションに関する呼び出し側の状態は変化しません。
TPEMATCH
]
TPETRAN
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
XA 準拠のリソース マネージャがグローバル トランザクションに含まれるようにするには、そのリソース マネージャが正常にオープンされている必要があります (詳細は TPOPEN()
を参照)。
停止されていたトランザクションを再開するプログラムは、そのトランザクションを停止させたプログラムと同じ論理マシン (LMID
) 上に存在している必要があります。ワークステーション クライアントの場合、そのワークステーションが接続されているワークステーション ハンドラ (WSH) は、そのトランザクションを停止させたワークステーション クライアントのハンドラと同じ論理マシン上に存在している必要があります。
TPABORT(3cbl)
、TPCOMMIT(3cbl)
、TPOPEN(3cbl)
、TPSUSPEND(3cbl)
TPRETURN()
- Oracle Tuxedo ATMI のサービス ルーチンからのリターン
01
TPSVCRET-REC
.
COPY TPSVCRET.
01TPTYPE-REC
.
COPY TPTYPE.
01DATA-REC
.
COPY User data.
01TPSTATUS-REC
.
COPY TPSTATUS.
COPY TPRETURN REPLACING TPSVCRET-REC BYTPSVCRET-REC
TPTYPE-REC BYTPTYPE-REC
DATA-REC BYDATA-REC
T
PSTATUS-REC BYTPSTATUS-REC
.
TPRETURN()
は、サービス ルーチンが完了したことを示します。TPRETURN()
には EXIT PROGRAM
文が含まれるので、Oracle Tuxedo ATMI のディスパッチャに制御を確実に正しく返すために、TPRETURN() はそれが起動されたルーチンと同じルーチンの中から呼び出されなければなりません。つまり、TPRETURN()
をサービス ルーチンのサブ プログラムから呼び出してはなりません。制御が Oracle Tuxedo ATMI のディスパッチャに返されないからです。
TPRETURN()
はサービスの応答メッセージを送るときに使用します。応答を受け取るサービスが TPCALL()
、TPGETRPLY()
、または TPRECV()
で待機している場合、TPRETURN()
の呼び出しが成功した時点で、受信側のレコードに応答が入ります。
会話サービスの場合、TPRETURN()
は接続自体も切断します。したがって、サービス ルーチンは、TPDISCON()
を直接呼び出すことができません。正しい結果を確実に得るためには、会話サービスに接続しているプログラムは、TPDISCON()
を呼び出してはなりません。その代わり、会話サービスが完了したことを示す通知を待ってください。つまり、TPEV-SVCSUCC
や TPEV-SVCFAIL
などのイベントが TPRETURN()
から送られるのを待ってください。
サービス ルーチンがトランザクション モードであった場合、TPRETURN()
はトランザクションのサービス部分を、そのトランザクションの完了時点でコミットあるいはアボートできる状態にします。サービスは同じトランザクションの一部として複数回呼び出すことができるので、TPCOMMIT()
または TPABORT()
がそのトランザクションの実行元によって呼び出されるまでは、完全にコミットあるいは中途終了させる必要は必ずしもありません。
TPRETURN()
は、該当サービス ルーチンが開始した要求/応答型サービス要求で期待されるすべての応答を受け取った後で、呼び出すようにしてください。そうでない場合は、サービスの性質に応じて、そのサービス ルーチンで通信を起動したプログラムに、[TPESVCERR
] 状態または TPEV-SVCERR
イベントが返されます。受信されていない未終了の応答は、受信後、Oracle Tuxedo ATMI のディスパッチャによって自動的に取り除かれます。また、これらの応答に対応する通信ハンドルは無効になります。
TPRETURN()
は、サービスが開始した接続をすべてクローズしてから呼び出すことも必要です。そうでない場合は、サービスの性質に応じて、そのサービス ルーチンで通信を起動したプログラムに、[TPESVCERR
] 状態または TPEV-SVCERR
イベントが返されます。また、即時切断イベント (つまり、TPEV-DISCONIMM
) が、オープンしているすべての接続を通して従属サービスに送信されます。
接続の制御に関しては、TPRETURN()
発行時に、サービス ルーチンがそれが呼び出された接続の制御権を持っていない場合、2 とおりの結果が考えられます。まず、サービス ルーチンが TPSVCRET-REC
内の TP-RETURN-VAL
に TPFAIL()
を、TPTYPE-REC
内の REC-TYPE
に SPACES
(つまり、送信データなし) を設定して TPRETURN()
を呼び出す場合、TPEV-SVCFAIL
イベントがこの会話の起動元に送信されます。あるいは、それ以外の設定で TPRETURN()
呼び出しが行われる場合、TPEV-SVCERR
イベントが起動元に送信されます。
会話サービスは、自分が開始していないオープン接続を 1 つだけ持っているので、どの通信ハンドルについてデータ (およびイベント) を送信すればいいかをサーバは認識しています。このため、通信ハンドルは TPRETURN()
には渡されません。
次に、TPRETURN()
の引数について説明します。TP-RETURN-VAL
は次のいずれかに設定できます。
TPSUCCESS
TPRETURN()
はそのトランザクションの呼び出し側の部分を、トランザクションが最終的にコミットする時点でコミットできるような状態にします。なお、TPRETURN()
を呼び出しても、必ずしもトランザクション全体が終了することにはつながりません。また、呼び出し側が正常終了を示したとしても、未処理の応答またはオープンされたままの接続がある場合や、該当サービス内で行われた作業が原因でトランザクションがアボートのみになった場合は、異常終了メッセージが送られます。つまり、応答の受信者は TPESVCERR()
表示あるいは TPEV-SVCERR
イベントを受け取ります。なお、サービス ルーチンの処理中になんらかの理由でトランザクションがアボートのみになると、TP-RETURN-VAL
は TPFAIL()
に設定されます。TPSUCCESS()
が会話サービスに対して指定されると、TPEV-SVCSUCC
イベントが生成されます。
TPFAIL
TPSVCERR
] 指示あるいは TPEV-SVCERR
イベントを受け取ります。呼び出し側がトランザクション モードの場合、TPRETURN()
はそのトランザクションをアボートのみにします (ただし、トランザクションは既にアボートのみになっていることもあります)。戻り処理が失敗した場合を除き、呼び出し側のデータが (もしあれば) 送られます。トランザクション タイムアウトになって、呼び出し側のデータが送られない場合もあります。このケースでは、応答を待つプログラムは [TPETIME
] エラーを受け取ることになります。
TPEXIT
TPFAIL()
と同じですが、トランザクションがアボートのみになり応答が要求者に返された後で、サーバは終了します。サーバが再開可能な場合は、自動的に再開します。
TP-RETURN-VAL
がこれらの 3 つの値のいずれかに設定されない場合、デフォルトで TPFAIL()
が使用されます。
アプリケーションが定義した戻り値 TPSVCRET-REC
内の APPL-CODE
を、サービスの応答を受け取るプログラムに送ることもできます。このコードは、応答を正常に送ることができれば (つまり、受信の呼び出しが正常に行われるか [TPESVCFAIL
] が返される、あるいはイベント TPEV-SVCSUCC
または TPEV-SVCFAIL
のいずれかが受信されれば)、TP-RETURN-VAL
の設定に関係なく送られます。APPL-CODE
の値は、受信側の変数 TPSTATUS-REC
内の APPL-RETURN-CODE
に入ります。
DATA-REC
は送信されるレコードであり、LEN
は、送信する DATA-REC
の大きさを指定します。ただし、DATA-REC
が長さの指定を必要としないタイプおよびサブタイプのレコードである場合、LEN
は無視されます (0
でかまいません)。REC-TYPE
が SPACES
の場合、DATA-REC
および LEN
は無視されます。このとき、サービスを呼び出したプログラムが応答を期待している場合には、応答はデータ部なしで送信されます。応答を期待していない場合、TPRETURN()
は渡されたデータをすべて無視し、応答を送信せずに終了します。REC-TYPE
が STRING
で、LEN
が 0
の場合は、要求はデータ部なしで送信されます。
会話サービスの場合、アプリケーションの戻りコードとデータ部が送られないケースがいくつかあります。
TPEV-DISCONIMM
を受け取っていた場合)、この呼び出しは単にサービス ルーチンを終了させ、現在のトランザクション (もしあれば) をロールバックする。この場合、呼び出し側のデータ レコードは送信されない。TPEV-SVCERR
または TPEV-SVCFAIL
が送出される。接続元がどのイベントを受け取った場合でも、データ レコードは送信されない。ただし、接続元が TPEV_SVCFAIL
イベントを受け取った場合は、接続元の TPSTATUS-REC
の APPL-RETURN-CODE
に戻りコードが入る。
TPRETURN()
には EXIT PROGRAM
文が含まれるので、呼び出し側には値が返されず、制御もサービス ルーチンには返されません。サービス ルーチンが TPRETURN()
を使用せずに終了すると (つまり、EXIT PROGRAM
文を直接使用するか、単純に「サービス ルーチンを終了する」と)、サーバはサービス エラーをサービスの要求者に返します。従属側へのオープン接続はすべてただちに切断され、未終了の非同期応答は取り除かれます。サーバが異常終了時にトランザクション モードにあった場合は、そのトランザクションには中途終了マークが付けられます。TPRETURN()
がサービス ルーチンとは別に使用される場合 (つまり、サービス ルーチンでないルーチンによって使用される場合)、TPRETURN() は何の影響も与えません。
TPRETURN はサービス ルーチンを終了させるので、引数の処理中またはそのルーチンの処理中に検出されたエラーは、そのルーチンの呼び出し側には示されません。このようなエラーが検出されると、TPCALL()
または TPGETRPLY()
でサービスからの結果を受信するプログラムについては、TP-STATUS
に [TPESVCERR
] が設定され、TPSEND()
または TPRECV()
を使用しているプログラムには、その会話について TPEV-SVCERR
イベントが送信されます。
TPCALL(3cbl)
、TPCONNECT(3cbl)
、TPFORWAR(3cbl)
TPSBLKTIME()
- 次のサービス呼び出しまたはすべてのサービス呼び出しのブロックタイムを秒単位で設定するルーチン
01 TPBLKDEF-REC.
COPY TPBLKDEF.
01 TPSTATUS-REC.
COPY TPSTATUS.
CALL “TPSBLKTIME” USING TPBLKDEF-REC TPSTATUS-REC.
TPSBLKTIME()
は、潜在的なブロッキング API のブロック時間値を秒単位で設定するために使用します。潜在的なブロッキング API は、値としてフラグ TBNOBLOCK
を使用できるシステム API として定義します。トランザクション タイムアウト値には影響しません。
TPBLKDEF-REC
の BLKTIME
は、ブロック時間を秒単位で設定します。ブロック時間の範囲は 0 ~ 32767 です。ブロック時間値 0 は、以前に設定されたブロック時間フラグ値がキャンセルされており、別のブロック時間フラグ値で設定されたブロック時間が優先されることを示します。TPSBLKTIME()
を呼び出さない場合は、UBBCONFIG
ファイルの *SERVICES
セクションまたはデフォルトの *RESOURCES
セクションの BLOCKTIME
値が使用されます。
注意 : | TPSBLKTIME() で設定したブロッキング タイムアウトは、UBBCONFIG ファイルの *SERVICES セクションおよび *RESOURCES セクションに設定された BLOCKTIME パラメータよりも優先されます。ブロック時間チェックの優先順位は次のとおりです。TPSBLKTIME(TPBLK-NEXT) 、TPSBLKTIME(TPBLK-ALL) 、*SERVICES 、*RESOURCES |
TPBLKDEF-REC
には、以下のいずれかの値を必ず 1 つ指定する必要があります。
TPBLK-NEXT
TPNOBLOCK
フラグが含まれている場合、TPSBLKTIME (TPBLK-NEXT)
は影響せず、ブロッキングなしの状態が継続します。
TPBLK-NEXT
ブロック時間値は、その直後の API 呼び出しの TPBLK-ALL
ブロック時間値をオーバーライドします。
TPSBLKTIME(TPBLK-NEXT)
はスレッド単位で動作します。したがって、アプリケーションで TPSBLKTIME(TPBLK-NEXT)
呼び出しや後続の API 呼び出しの周囲にミューテックスを使用する必要はありません。
TPBLK-ALL
TPSBLKTIME()
が呼び出されるまでの間、後続のすべての潜在的なブロッキング API のブロック時間値を設定します。呼び出された API に TPNOBLOCK
フラグが含まれている場合、TPSBLKTIME(TPBLK-ALL)
は影響せず、ブロッキングなしの状態が継続します。
TPSBLKTIME(TPBLK-ALL)
はコンテキスト単位で動作します。したがって、TPSBLKTIME(TPBLK-ALL)
は、複数のスレッドで使用されるコンテキストのいずれか 1 つのスレッドで呼び出す必要があります。
TPSBLKTIME(TPBLK-ALL)
は、TPTERM(3cbl)
が呼び出された後のコンテキストには影響しません。
注意 : | スレッド タイミングの依存関係に影響されないブロック時間値を実行するためには、TPINITIALIZE(3cbl) の直後、TPGETCTXT(3cbl) の戻り値がほかのスレッドで使用できるようになる前に、TP-MULT-ICONTEXTS フラグを使用してマルチスレッド コンテキストで TPSBLKTIME(TPBLK-ALL) を呼び出すのが最適な方法です。 |
注意 : | マルチスレッド サーバ上のサービスで TPSBLKTIME(TPBLK-ALL) を呼び出した場合は、その時点で実行されているスレッドにのみ影響します。すべてのサービスのブロック時間を設定する場合は、TPSBLKTIME(TPBLK-ALL) を TPSVRINIT(3cbl) と一緒に使用することをお勧めします。 |
TPSBLKTIME()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。
次の条件が発生すると、TPSBLKTIME
は異常終了し、TP-STATUS
に次のいずれかの値を設定します。異常終了しても、トランザクション タイムアウト値には影響しません。
TPEINVAL
]
TPERELEASE
]
TPESYSTEM
]
TPCALL(3cbl)、TPCONNECT(3cbl)、TPRECV(3cbl)、TPGBLKTIME(3cbl)、UBBCONFIG(5)
01
TPCMTDEF-REC
.
COPY TPCMTDEF.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPSCMT" USINGTPCMTDEF-REC
TPSTATUS-REC
.
TPSCMT()
は TP-COMMIT-CONTROL
特性を TPCMTDEF-REC
に指定されている値に設定します。この TP-COMMIT-CONTROL
特性は、制御をその呼び出し側に返す際の TPCOMMIT()
の動作に影響します。プログラムがトランザクション モードにあるかどうかに関係なく、プログラムから TPSCMT()
を呼び出すことができます。他のプログラムがコミットしなければならないトランザクションに呼び出し側が参加している場合は、TPSCMT()
を呼び出してもそのトランザクションに影響を与えないことに注意してください。むしろ、呼び出し側がコミットするその後のトランザクションに影響を与えます。
ほとんどの場合、トランザクションは、Oracle Tuxedo ATMI のプログラムが TPCOMMIT()
を呼び出したときにのみコミットされます。ただし、例外が 1 つあります。UBBCONFIG
ファイルの SERVICES
セクションで AUTOTRAN
変数が使用可能になっているために、サービスがトランザクション モードでディスパッチされる場合は、そのトランザクションは TPRETURN()
の呼び出し時点で完了します。TPFORWAR()
が呼び出された場合、そのトランザクションは、サーバが最終的に TPRETURN()
を呼び出すことによって終了します。このため、TPRETURN()
を呼び出すサービスにおける TP-COMMIT-CONTROL
特性の設定内容により、TPCOMMIT()
がサーバ内からいつ制御を返すかが決まります。TPCOMMIT()
がヒューリスティックなエラー コードを返した場合、サーバはメッセージをログ ファイルに書き込みます。
クランアントが Oracle Tuxedo ATMI アプリケーションに参加する場合は、この特性の初期設定はコンフィグレーション ファイルから取られます (「UBBCONFIG(5)」の RESOURCES
セクションの CMTRET
変数を参照)。
次に、TPCMTDEF-REC
の有効な設定の一覧を示します。
TP-CMT-LOGGED
TPCOMMIT()
を終了させることを示します。この設定により、TPCOMMIT()
の呼び出し側へのより迅速な応答が得られるようになります。ただし、第 2 段階の処理が完了するまでに生じるタイミングのずれが原因で、トランザクションの参加リソースが、その作業の完了 (つまり、中途終了) をヒューリスティックに判断してしまうというリスクが生じます。このような場合、TPCOMMIT()
が終了していないため、呼び出し側にこの状況を知らせる方法がありません (ただし、リソース マネージャがヒューリスティックな判断を行った場合には、Oracle Tuxedo システムによってメッセージがログ ファイルに書き込まれてはいます)。正常な状態では、第 1 フェーズの間にコミットすることを約束している参加リソースは、第 2 フェーズでコミットします。一般に、ネットワークやサイトの障害が原因で問題が生じると、第 2 フェーズでヒューリスティックな判断がなされます。
TP-CMT-COMPLETE
TPCOMMIT()
を終了させることを示します。この設定により、TPCOMMIT()
は第 2 フェーズのコミット中にヒューリスティックな判断がなされたことを示すことができます。
TPSCMT()
は正常終了時には、TP-STATUS
に [TPOK
] を設定し、TP-COMMIT-CONTROL
特性の以前の値を返します。
次の条件が発生すると、TPSCMT()
は異常終了し、TP-STATUS
に次の値を設定します。
TPEINVAL
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPBEGIN()
、TPCOMMIT()
、および TPABORT()
を使用して Oracle Tuxedo ATMI のトランザクションを記述する際には、XA インタフェースに準拠した (および呼び出し側に適切にリンクされている) リソース マネージャの行う作業のみがトランザクションとしての特性を備えていることを忘れないようにすることが重要です。トランザクションで行われるその他の処理内容は、TPCOMMIT()
や TPABORT()
の影響を受けません。そのリソース マネージャが行った処理が Oracle Tuxedo ATMI のトランザクションの一部となるよう、XA インタフェースを満たすリソース マネージャをサーバにリンクする方法については、「buildserver(1)」を参照してください。
TPABORT(3cbl)
、TPBEGIN(3cbl)
、TPCOMMIT(3cbl)
、TPGETLEV(3cbl)
TPSEND()
- 会話接続でメッセージを送信するルーチン
01
TPSVCDEF-REC
.
COPY TPSVCDEF.
01TPTYPE-REC
.
COPY TPTYPE.
01DATA-REC
.
COPY User data.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPSEND" USINGTPSVCDEF-REC
TPTYPE-REC
DATA-REC
TPSTATUS-REC
.
TPSEND()
は、別のプログラムにオープン接続を介してデータを送信するときに使用します。このとき、呼び出し側がこの接続の制御権をもたなければなりません。COMM-HANDLE
は、データを送信するオープン接続を指定するものです。COMM-HANDLE
は、TPCONNECT()
または TPSVCSTART()
から返される通信ハンドルです。
DATA-REC
は、送信するデータであり、LEN
は、送信するデータの大きさを指定します。ただし、DATA-REC
が長さの指定を必要としないタイプのレコードである場合 LEN
は無視されます (0
でかまいません)。REC-TYPE
が SPACES
の場合は、DATA-REC
および LEN
は無視され、メッセージはデータなしで送信されます (これは、たとえば、データの送信なしに接続の制御権だけを与えるときなどに使用されます)。
次に、TPSVCDEF-REC
の有効な設定の一覧を示します。
TPRECVONLY
TPSEND()
呼び出しを発行できなくなります。接続の他方の側のプログラムが TPSEND()
によって送られたデータを受け取る場合、それが接続の制御を得たことを示すイベント (TPEV-SENDONLY
) も受け取ります (そして、それ以降、TPRECV()
呼び出しは発行できません)。TPRECVONLY
または TPSENDONLY
のいずれかを指定しなければなりません。
TPSENDONLY
TPNOBLOCK
TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPBLOCK
TPBLOCK
がセットされ、ブロッキング条件が存在する場合は、呼び出し側はブロッキング条件が消失するか、またはタイムアウト (トランザクション タイムアウト、またはブロッキング タイムアウト) が発生するまでブロックします。TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPNOTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPSIGRSTRT
TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
TPNOSIGRSTRT
TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
COMM-HANDLE
に対してイベントが存在する場合、TPSEND()
は呼び出し側のデータを送信せずに終了します。イベントのタイプは、TPEVENT()
に返されます。TPSEND()
の有効なイベントを次に示します。
TPEV-DISCONIMM
TPDISCON()
により即時切断要求を出したことを、あるいは接続の起動元が従属側のオープン接続を持って TPRETURN()
を出したことを示します。このイベントは、通信エラー (サーバ、マシン、ネットワークの障害など) により接続が切断されたときにも起動元またはその従属側に返されます。
TPEV-SVCFAIL
TPRETURN()
を出したことを示します。さらに、TPRETURN()
が TPFAIL()
を設定した状態でデータなし (つまり、TPRETURN()
に渡された REC-TYPE
に SPACES
が設定されている状態) で発行されています。
TPEV-SVCERR
TPRETURN()
を出したことを示します。さらに、TPEV-SVCFAIL
に記述されている以外の形で、TPRETURN()
が出されました。
これらのイベントはそれぞれ、即時切断通知 (つまり、正常ではなく中途で終了) を示すので、処理途中のデータは失われます。この接続に使用された通信ハンドルは無効になります。2 つのプログラムが同じトランザクションに参加していた場合には、そのトランザクションに中途終了マークが付けられます。
TPSEND()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。イベントが存在し、エラーが発生しなかった場合は、TPSEND()
は TP-STATUS
に [TPEEVENT
] を設定します。TP-STATUS
に [TPEEVENT
] が設定され、TP-EVENT
が TPEV-SVCSUCC
または TPEV-SVCFAIL
の場合、APPL-RETURN-CODE
には、TPRETURN()
の一部として送信されたアプリケーション定義の値が入ります。
次の条件が発生すると、TPSEND()
は異常終了し、TP-STATUS
に次の値を設定します。特に説明がなければ、この障害は呼び出し側のトランザクションには影響しません。
TPEINVAL
]
TPEBADDESC
]
TPETIME
]
TPBLOCK
と TPTIME
の両方が指定された場合にのみ発生します。
TPETIME
が発生します。ただし、例外が 1 つあります。例外は、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションのために送信されない要求 (つまり、TPNOTRAN
、TPNOBLOCK
、および TPNOREPLY
が設定された状態で TPACALL()
が呼び出される場合) です。
TX_ROLLBACK_ONLY
状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME
で異常終了します (前の段落で説明した例外を除く)。
TPEEVENT
]
TPEBLOCK
]
TPGOTSIG
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPCONNECT(3cbl)
、TPDISCON(3cbl)
、TPRECV(3cbl)
TPSETCTXT()
- 現在のアプリケーション関連のコンテキスト識別子を設定する
01TPCONTEXTDEF-REC
.
COPY TPCONTEXTDEF.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPSETCTXT" USING TPCONTEXTDEF-REC TPSTATUS-REC.
TPSETCTXT()
は、現在のプログラムが動作するコンテキストを定義します (マルチスレッドの COBOL アプリケーションは現在サポートされていません)。これ以降の Oracle Tuxedo の呼び出しは、TPCONTEXTDEF-REC
の CONTEXT
で示されるアプリケーションを参照します。TPCONTEXTDEF-REC
の CONTEXT
の値は、事前の TPGETCTXT()
呼び出しで提供されます。CONTEXT
の値が TPNULLCONTEXT
の場合、プログラムはどの Oracle Tuxedo コンテキストとも関連しません。入力時に TPCONTEXTDEF-REC
の CONTEXT
に TPINVALIDCONTEXT
を設定すると無効になります。
TPSETCTXT()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。
異常終了時には、TPSETCTXT()
は呼び出し側プロセスのコンテキストを変更せず、TP-STATUS
にエラー条件を示す値を設定します。
TPSETCTXT()
は異常終了時には、TP-STATUS
に次のいずれかの値を設定します。
TPEINVAL
]
TPENOENT
]
TPEPROTO
]
TPSETCTXT()
の呼び出し方法が不適切です。たとえば、TPINITIALIZE()
を呼び出していないプロセスや TP-MULTI-CONTEXTS
を設定せずに TPINITIALIZE()
が呼び出されたプロセスで TPSETCTXT() が呼び出された場合です。
TPESYSTEM
]
TPEOS
]
「COBOL アプリケーション トランザクション モニタ インタフェースの紹介」、TPGETCTXT(3cbl)
TPSETUNSOL()
- 非請求メッセージの処理方法の設定
01
CURR-ROUTINE
PIC S9(9) COMP-5.
01PREV-ROUTINE
PIC S9(9) COMP-5.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPSETUNSOL" USINGCURR-ROUTINE
PREV-ROUTINE
TPSTATUS-REC
.
TPSETUNSOL()
は、非請求メッセージが Oracle Tuxedo システムのライブラリによって受け取られる際に呼び出すルーチンをクライアントが指定できるようにします。TPSETUNSOL()
の最初の呼び出しの前に、Oracle Tuxedo ATMI ライブラリがクライアントのために受け取った非請求メッセージは記録されますが、無視されます。関数番号 CURR-ROUTINE
に 0
を設定して TPSETUNSOL()
を呼び出した場合も、同じ結果になります。システムが通知や検出のために使用する方法は、アプリケーションのデフォルトの設定で決まります。このデフォルトは、クライアントごとに変更できます (「TPINITIALIZE(3cbl)
」を参照)。
TPSETUNSOL()
の呼び出し時に CURR-ROUTINE
に渡されるルーチン番号には、定義済みの 16 のルーチンから 1 つを選択します。ルーチン名は、非請求メッセージを処理する C のルーチンの場合は、_tm_dispatch1
から _tm_dispatch8
まで、同じメッセージを処理する COBOL のルーチンの場合は、TMDISPATCH9
から TMDISPATCH16
まででなければなりません。C の関数 (_tm_dispatch1
から _tm_dispatch8
まで) は、tpsetunsol(3c) に記述されているパラメータ定義に準拠していなければなりません。COBOL のルーチン (TMDISPATCH9
から TMDISPATCH16
まで) は、データの受信に TPGETUNSOL()
を使用しなければなりません。
C アプリケーションの非請求メッセージ処理ルーチン内での処理は、Oracle Tuxedo 関数 tpalloc()
、tpfree()
、tpgetctxt()
、tpgetlev()
、tprealloc()
、および tptypes()
に限定されています。
COBOL アプリケーションの非請求メッセージ処理ルーチン内での処理は、Oracle Tuxedo 関数 TPGETLEV()
および TPGETCTXT()
に限定されています。
TPSETUNSOL()
は正常終了時には、TP-STATUS
に [TPOK
] を設定し、非請求メッセージ処理ルーチンの以前の設定条件を返します。PREV-ROUTINE
が 0
の場合、以前に非請求メッセージ処理ルーチンが設定されていないことを示し、正常終了です。
次の条件が発生すると、TPSETUNSOL()
は異常終了し、TP-STATUS
に次の値を設定します。
TPEINVAL
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPNOTIFY()
に記述されているインタフェースはすべて、ネイティブ サイトの UNIX システムベースのプロセッサ上で利用できます。さらに、ルーチン TPBROADCAST()
と TPCHKUNSOL()
およびルーチン TPSETUNSOL()
は、UNIX および MS-DOS ワークステーション プロセッサ上で利用できます。
TPSETUNSOL()
は Windows、OS/2、および RS6000 では利用できません。ダイナミック リンク ライブラリと共有ライブラリの動作方法がこれらの環境では異なるためです。これらのプラットフォーム上で呼び出されると、TPEPROTO()
が返されます。これらの環境では、C 言語のインタフェース tpsetunsol()
を使用してハンドラ関数を設定します。
TPGETCTXT(3cbl)
、TPGETUNSOL(3cbl)
、TPINITIALIZE(3cbl)
、TPTERM(3cbl)
01
TPPRIDEF-REC
.
COPY TPPRIDEF.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPSPRIO" USINGTPPRIDEF-REC
TPSTATUS-REC
.
TPSPRIO()
は、次に送信あるいは転送される要求の優先順位を設定します。設定された優先順位は、次に送信される要求に対してのみ有効です。キュー機能がインストールされている場合、優先順位は、TPENQUEUE()
または TPDEQUEUE()
によってキューに登録されるメッセージまたはキューから取り出されるメッセージについても設定できます。デフォルトの設定では、TPPRIDEF-REC
内の PRIORITY
の設定が正か負かにより、サービスのデフォルトの優先順位が最大 100、あるいは最小 1 に上下します。100 が最も高い優先順位です。要求のデフォルトの優先順位は、その要求の送信先となるサービスによって決まります。このデフォルトの設定は、管理時に指定してもよいですし (「UBBCONFIG(5)」を参照)、システムの省略時値 50 を使用してもかまいません。TPSPRIO()
は、TPCONNECT()
または TPSEND()
を介して送られるメッセージには影響しません。
次に、TPPRIDEF-REC
の有効な設定の一覧を示します。
TPABSOLUTE
PRIORITY
の絶対値で送信されます。PRIORITY
の絶対値は 1 から 100 までの範囲内の数値とします (最も高い優先順位は 100 です)。この範囲外の値を指定すると、デフォルトの値が使用されます。
TPRELATIVE
TPSPRIO()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。
次の条件が発生すると、TPSPRIO()
は異常終了し、TP-STATUS
に次の値を設定します。
TPEINVAL
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPACALL(3cbl)
、TPCALL(3cbl)
、TPDEQUEUE(3cbl)
、TPENQUEUE(3cbl)
、TPGPRIO(3cbl)
01
TPEVTDEF-REC
.
COPY TPEVTDEF.
01TPQUEDEF-REC
.
COPY TPQUEDEF.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPSUBSCRIBE" USINGTPEVTDEF-REC
TPQUEDEF-REC
TPSTATUS-REC
.
呼び出し側は、TPEVTDEF-REC
の EVENT-EXPR
で指定されたイベントまたはイベント セットをサブスクライブする際に TPSUBSCRIBE()
を使用します。サブスクリプションは Oracle Tuxedo のイベント ブローカ、TMUSREVT()
によって管理され、イベントが TPPOST()
を介して通知されるときサブスクライバに知らせるために使用されます。それぞれのサブスクリプションには、通知メソッドを指定します。通知メソッドは、クライアント通知、サービス呼び出し、または安定ストレージ内のキューへのメッセージ登録の 3 つの内いずれかの形式をとります。通知方法は、サブスクライバのプロセス タイプおよび TPEVTDEF-REC
の TPEV-METHOD-FLAG
によって決定されます。
サブスクライブするイベントまたはイベント セットの名前は、正規表現、つまり TPEVTDEF-REC
の EVENT-EXPR
によって指定されますが、EVENT-EXPR フィールドが SPACES
であってはなりません。正規表現は、tpsubscribe(3c)
で指定される形式です。たとえば、EVENT-EXPR
が "¥e¥e..*"
のとき、呼び出し側はシステムが生成したすべてのイベントをサブスクライブし、EVENT-EXPR
が "¥e¥e.SysServer.*"
であれば、システムが生成したサーバ関連のイベントをサブスクライブします。また、EVENT-EXPR
が "[A-Z].*"
であれば、呼び出し側はアルファベットの A から Z の文字で始まるすべてのユーザ イベントをサブスクライブし、EVENT-EXPR
が ".*(ERR|err).*"
であれば、"ERR
" または "err
" という文字列を含むすべてのユーザ イベントをサブスクライブします。たとえば、"account_error
" や "ERROR_STATE
" というイベントはどちらもその対象となります。
TPEVTDEF-REC
の EVENT-FILTER
は、論理型フィルタ規則を含む文字列で、イベント ブローカがイベントを通知する前に、有効であることが評価されなければなりません。ポストするイベントを受け取ると、イベント ブローカはそのイベントのデータにフィルタ規則 (存在する場合) を適用します。データがフィルタ ルールのチェックにパスした場合、イベント ブローカは通知メソッドを呼び出します。データがフィルタ ルールを通過しない場合は、イベント ブローカは対応する通知メソッドを呼び出しません。呼び出し側は、異なるフィルタ ルールを利用して同じイベントを何度でもサブスクライブすることができます。
フィルタ ルールは、フィルタ ルールの適用対象となる型付きレコードによって異なります。FML レコードや VIEW レコードの場合、フィルタ規則は文字列であり、それぞれの論理式コンパイラに渡すことができ (「Fboolco、Fboolco32、Fvboolco、Fvboolco32(3fml)」を参照)、通知されるレコードに対して評価されます (「Fboolev、Fboolev32、Fvboolev、Fvboolev32(3fml)」を参照)。STRING
レコードの場合、フィルタ規則は tpsubscribe(3c)
で指定される形式の正規表現です。その他のタイプのレコードについては、それぞれカスタマイズされた独自のフィルタ評価機構が必要になります (カスタマイズされたフィルタ評価機構の追加に関しては、「buffer(3c)」および「typesw(5)」を参照)。EVENT-EXPR
に該当するフィルタ ルールが存在しない場合は、EVENT-FILTER
は SPACES
にセットする必要があります。
サブスクライバが Oracle Tuxedo ATMI のクライアント プロセスであり、TPEVTDEF-REC
の TPEVNOTIFY
が設定されている場合、サブスクライブしたイベントが通知されると、イベント ブローカはサブスクライバに非請求メッセージを送出します。つまり、EVENT-EXPR
に対して有効であると評価されるイベント名が通知されると、イベント ブローカは、EVENT-EXPR
に関連するフィルタ規則を使用して、通知されるデータをチェックします。データがフィルタ ルールによるチェックにパスした場合、あるいはそのイベントに対して適用すべきフィルタ ルールが存在しない場合は、サブスクライバはイベントとそのデータ、および非請求メッセージを受け取ることになります。非請求メッセージを受け取るためには、クライアントは非請求処理ルーチンを (TPSETUNSOL()
を利用して) 登録しておく必要があります。Oracle Tuxedo ATMI のサーバ プロセスが TPEVNOTIFY
を設定して TPSUBSCRIBE()
を呼び出すと、TPSUBSCRIBE()
は異常終了し、TPSTATUS-REC
の TP-STATUS
に [TPEPROTO
] が設定されます。
非請求メッセージを介してイベント通知を受け取るクライアントは、終了する前に、イベント ブローカのアクティブなサブスクリプションのリストから、それぞれのサブスクリプションを削除する必要があります (詳細は TPUNSUBSCRIBE()
を参照)。クライアントは、TPUNSUBSCRIB()
のワイルドカード ハンドル、-1 を使用することにより、非請求メソッドに関連するサブスクリプションを含むあらゆる「非永続的」サブスクリプションを削除することができます。プロセス終了後も存続するサブスクリプションおよびそれらに関連する通知メソッドについては、以下の TPEVPERSIST
の説明を参照してください。クライアントが非持続型のサブスクリプションを削除せずに終了した場合は、イベント ブローカはクライアントにアクセスできなくなったことを検出すると、そのクライアントのサブスクリプションを削除します。
TPEVNOTIFY
が設定される場合は、TPEVNOTRAN
と TPEVNOPERSIST
も設定される必要があります。そうでない場合、TPSUBSCRIBE()
は異常終了し、TP-STATUS
に [TPEINVAL
] が設定されます。このことは、非請求の通知メソッドを持つクライアントによるサブスクリプションは、トランザクショナルでも、持続型でもあり得ないことを意味します。
サブスクライバ (プロセスのタイプとは無関係) が TPEVTDEF-REC
の TPEVSERVICE()
を設定すると、イベント通知は TPEVTDEF-REC
の NAME-1
で指定された Oracle Tuxedo ATMI のサービス ルーチンに送信されます。つまり、EVENT-EXPR
に対して有効であると評価されるイベント名が通知されると、イベント ブローカは、EVENT-EXPR
に関連するフィルタ規則を使用して、通知されるデータをチェックします。データがフィルタ ルールによるチェックにパスした場合、あるいはそのイベントに適用すべきフィルタ ルールが存在しない場合は、サービス要求はそのイベントに付随するデータとともに NAME-1
に渡されます。NAME-1
には Oracle Tuxedo ATMI の有効なあらゆるサービス名をセットすることができ、また、サブスクリプションが行われた時点でアクティブであってもアクティブでなくてもかまいません。イベント ブローカによって呼び出されたサービス ルーチンは、応答データなしで戻ります。つまり、これらのサービス ルーチンは、TPRETURN()
を呼び出す際には TPTYPE-REC
の REC-TYPE
を SPACES にセットする必要があります。TPRETURN()
に渡されるデータは、すべて切り捨てられます。
TPEVTDEF-REC
の TPEVTRAN
も設定され、TPPOST()
を呼び出すプロセスがトランザクション モードの場合、イベント ブローカは、サブスクライブされるサービス ルーチンをポスト元のトランザクションの一部として呼び出します。イベント ブローカ TMUSREVT()
とサブスクライブされるサービス ルーチンは両方とも、トランザクションをサポートするサーバ グループに属している必要があります (詳細は「UBBCONFIG(5)」を参照)。TPEVNOTRAN
が設定されている場合、イベント ブローカは、サブスクライブされるサービス ルーチンをポスト元のトランザクションとは別に呼び出します。
サブスクライバ (プロセスのタイプは無関係) が TPEVTDEF-REC
の TPEVQUEUE()
を設定すると、イベント通知は TPEVTDEF-REC
の NAME-1
で指定されたキュー スペースの、TPEVTDEF-REC
の NAME-2
で指定されたキューに登録されます。つまり、EVENT-EXPR
に対して有効であると評価されるイベント名が通知されると、イベント ブローカは、EVENT-EXPR
に関連するフィルタ規則を使用して、通知されるデータをチェックします。データがフィルタ規則によるチェックにパスした場合、あるいはそのイベントに適用すべきフィルタ規則が存在しない場合、イベント ブローカは、イベントとともに通知されるあらゆるデータとメッセージを、NAME-1
で指定されたキュー スペースの NAME-2
で指定されたキューに登録します。キュー スペースとキューは、Oracle Tuxedo システムで使用できるあらゆるキュー スペースおよびキューを指定でき、どちらもサブスクリプションの時点で存在していても存在していなくてもかまいません。
TPQUEDEF-REC
には、通知されるイベントをイベント ブローカがキューに登録する際の手順をさらに詳しく指示するためのオプションを含めることができます。呼び出し側で指定すべきオプションがない場合は、TPQUEDEF-REC
を LOW-VALUE
にセットします。一方、指定すべきオプションがある場合は、TPENQUEUE()
の項の「制御パラメータ」のセクションで説明した方法でオプションを指定します (特に TPENQUEUE()
の入力データ制御の有効なフラグ設定について説明した箇所を参照のこと)。
TPEVTDEF-REC
の TPEVTRAN
も設定され、TPPOST()
を呼び出すプロセスがトランザクション モードの場合、イベント ブローカは、通知されるイベントとそのデータをポスト元のトランザクションの一部としてキューに登録します。イベント ブローカ TMUSREVT()
は、トランザクションをサポートするサーバ グループに属している必要があります (詳細は「UBBCONFIG(5)」を参照)。TPEVNOTRAN
が設定されている場合、イベント ブローカは、通知されるイベントとそのデータをポスト元のトランザクションとは別にキューに登録します。
デフォルトでは、Oracle Tuxedo のイベント ブローカは、通知先のリソースが使用不可能である場合はサブスクリプションを削除します。たとえば、イベントのサブスクリプションに関連するサービス ルーチン、またはキュー スペースとキューにイベント ブローカがアクセスできない場合などです。TPEVTDEF-REC
の TPEVPERSIST
は、サブスクライバがこのようなエラーに遭遇したあとも (将来リソースが再度使用可能になった場合に備えて) 引き続きサブスクリプションを維持したい場合にセットします。永続的なサブスクリプションは、TPEVSERVICE()
および TPEVQUEUE()
の通知メソッドでしか利用できません。TPEVNOTIFY
が設定されるときに TPEVPERSIST
を使用することはできません。使用した場合、関数は異常終了し、TP-STATUS
に [TPEINVAL
] が設定されます。TPEVNOPERSIST
を設定した場合、サブスクリプションで指定されたクライアント、サービス名、またはキュー スペースとキュー名にアクセスする際にエラーが発生すると、イベント ブローカはこのサブスクリプションを削除します。
TPEVPERSIST
と TPEVTRAN
がともに設定されて、イベント通知時にリソースが使用できなかった場合、イベント ブローカはポスト元に戻り、トランザクションがアボートされるようにします。つまり、サブスクリプションが保持されている場合でも、リソースが使用できなければポスト元のトランザクションは異常終了します。
TPSUBSCRIBE()
で要求されるサブスクリプションと一致するものがイベント ブローカのアクティブなサブスクリプションのリストに既に存在する場合、関数は異常終了し、TP-STATUS
に [TPEMATCH
] が設定されます。サブスクリプションが既存のサブスクリプションと一致すると判断されるには、EVENT-EXPR
と EVENT-FILTER
の両方が、イベント ブローカのアクティブなサブスクリプションのリストに既に存在するサブスクリプションのものと一致することが条件です。また、通知メソッドによっては、サブスクリプションの一致を判断する際にこれ以外の基準も使用されます。
TPEVNOTIFY
がセットされていると、呼び出し側の CLIENTID
(システムが定義したクライアント識別子) もサブスクリプションの一致を検出する際の判断材料に加えられます。つまり、EVENT-EXPR
、EVENT-FILTER
、および呼び出し側の CLIENTID
がイベント ブローカのリストに既に存在するサブスクリプションのデータと一致する場合、TPSUBSCRIBE()
は異常終了します。
TPEVSERVICE()
が設定されている場合は、EVENT-EXPR
、EVENT-FILTER
、および NAME-1
で指定されるサービス名がイベント ブローカのリストに既に存在するサブスクリプションのそれと一致すると、TPSUBSCRIBE()
は異常終了します。
TPEVQUEUE()
が設定されている場合は、イベント ブローカはサブスクリプションの一致を判断する際に、EVENT-EXPR
や EVENT-FILTER
のほか、キュー スペース、キュー名、および相関識別子を使用します。相関識別子を利用することにより、同じ送信先の、同じイベント式やフィルタ ルールに対する複数のサブスクリプションを区別することができます。したがって、呼び出し側が TPEVQUEUE()
と TPQNOCOORID()
の両方を設定した場合は、EVENT-EXPR
、EVENT-FILTER
、NAME-1
で指定されるキュー スペースの名前、および NAME-2
で指定されるキューの名前が、イベント ブローカのリストに既に存在するサブスクリプション (相関識別子は指定されていない) のデータと一致すると、TPSUBSCRIBE()
は異常終了します。さらに、TPQCOORID()
が設定されている場合、EVENT-EXPR
、EVENT-FILTER
、NAME-1
、NAME-2
、および TPQUEDEF-REC
の CORRID
がイベント ブローカのリストに既に存在するサブスクリプション (同じ相関識別子を持つ) のデータと一致すると、TPSUBSCRIBE()
は異常終了します。
TPNOBLOCK
TP-STATUS
は [TPEBLOCK
] に設定されます。TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPBLOCK
TPBLOCK
がセットされ、ブロッキング条件が存在する場合は、呼び出し側はブロッキング条件が消失するか、またはタイムアウト (トランザクション タイムアウト、またはブロッキング タイムアウト) が発生するまでブロックします。TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPNOTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPSIGRSTRT
TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
TPNOSIGRSTRT
TP-STATUS
は [TPGOTSIG
] にセットされます。TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
TPSUBSCRIBE()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。また、TPSUBSCRIBE()
は、TPEVTDEF-REC
の SUBSCRIPTION-HANDLE
にこのサブスクリプションのハンドルを設定します。SUBSCRIPTION-HANDLE
は、イベント ブローカのアクティブなサブスクリプションのリストからこのサブスクリプションを削除するために TPUNSUBSCRIBE()
を呼び出す際に利用できます。サブスクライバやその他のプロセスは、いずれも返されたハンドルを利用してこのサブスクリプションを削除することができます。
次の条件が発生すると、TPSUBSCRIBE()
は異常終了し、TP-STATUS
に次のいずれかの値を設定します (特に記述した場合を除いては、エラーが呼び出し側のトランザクションに影響を及ぼすことはありません)。
TPEINVAL
]
TPENOENT
]
TPELIMIT
]
TPEMATCH
]
TPEPERM
]
TPETIME
]
TPBLOCK
と TPTIME
の両方が指定された場合にのみ発生します。
TPETIME
が発生します。ただし、例外が 1 つあります。例外は、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションのために送信されない要求 (つまり、TPNOTRAN
、TPNOBLOCK
、および TPNOREPLY
が設定された状態で TPACALL()
が呼び出される場合) です。
TX_ROLLBACK_ONLY
状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME
で異常終了します (前の段落で説明した例外を除く)。
TPEBLOCK
]
TPGOTSIG
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
buffer(3c)、tpsubscribe(3c)、TPENQUEUE(3cbl)
、TPPOST(3cbl)
、TPSETUNSOL(3cbl)
、TPUNSUBSCRIBE(3cbl)
、Fboolco、Fboolco32、Fvboolco、Fvboolco32(3fml)、Fboolev、Fboolev32、Fvboolev、Fvboolev32(3fml)、EVENTS(5)、EVENT_MIB(5)、TMSYSEVT(5)、TMUSREVT(5)、tuxtypes(5)、typesw(5)、UBBCONFIG(5)
TPSUSPEND()
- グローバル トランザクションの一時停止
01TPTRXDEF-REC
.
COPY TPTRXDEF.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPSUSPEND" USINGTPTRXDEF-REC TPSTATUS-REC
.
TPSUSPEND()
は、呼び出し側のプログラムでアクティブなトランザクションを一時停止するために使用されます。TPBEGIN()
で始めたトランザクションは、TPSUSPEND()
で一時停止できます。中断しているプログラム、あるいはその他のプログラムは、中断しているトランザクション上で TPRESUME()
を利用して作業を再開することができます。TPSUSPEND()
が復帰すると、呼び出し側はトランザクション モードではなくなります。ただし、トランザクションが中断されている間は、そのトランザクションに関係のあるリソース (データベース ロックなど) はすべてアクティブな状態に保たれます。アクティブなトランザクションと同様、中断されたトランザクションにもトランザクションを最初にスタートする際に割り当てたトランザクション タイムアウトの値が適用されます。
トランザクションを別のプロセスで再開するには、TPSUSPEND()
の呼び出し側が明示的に TPBEGIN()
を呼び出すことによってトランザクションを起動している必要があります。TPSUSPEND()
は、トランザクションの開始元以外のプロセスから呼び出すこともできます (たとえば、トランザクション モードで要求を受信するサーバなど)。後者の場合、TPSUSPEND()
の呼び出し側のみ TPRESUME()
を呼び出してトランザクションを再開することができます。このような方法が認められているのは、プロセスがトランザクションのスタートを一時中断し、そのトランザクションを終了する前に別のトランザクションをスタートさせ、作業を行えるようにするためです (エラーを記録するトランザクションを実行してから最初のトランザクションをロールバックする場合など)。
TPSUSPEND()
は、一時停止するトランザクションの識別子を TRANID
に設定します。
正常終了するためには、呼び出し側は TPSUSPEND()
を実行する前に、サーバとの未終了のコミュニケーションを全て完了していなければなりません。つまり、呼び出し側は、呼び出し側のトランザクションに関連のある TPACALL()
で送出した要求に対する応答を、すべて受け取っていなければなりません。また、呼び出し側では、呼び出し側のトランザクションに関連のある会話サービスとの接続をすべてクローズしておくことも必要です (つまり、TPRECV()
は TPEV-SVCSUCC イベントを返していなければなりません)。いずれかの規則に従わない場合、TPSUSPEND()
は異常終了し、呼び出し側の現在のトランザクションは一時停止せず、トランザクション通信ハンドルはすべて有効なままです。呼び出し側のトランザクションとは関連のない通信ハンドルは、TPSUSPEND()
の結果に関係なく、有効なままです。
TPSUSPEND()
は正常終了時には、[TPOK]
を設定します。
次の条件が発生すると、TPSUSPEND()
は異常終了し、TP-STATUS
に次の値を設定します。
TPEABORT
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPACALL(3cbl)
、TPBEGIN(3cbl)
、TPRECV(3cbl)
、TPRESUME(3cbl)
TPSVCSTART()
- Oracle Tuxedo ATMI のサービスの開始
01
TPSVCDEF-REC
.
COPY TPSVCDEF.
01TPTYPE-REC
.
COPY TPTYPE.
01DATA-REC
.
COPY User data.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPSVCSTART" USINGTPSVCDEF-REC
TPTYPE-REC
DATA-REC
TPSTATUS-REC
.
TPSVCSTART()
は、サービス ルーチンをコーディングする際に最初に呼び出す Oracle Tuxedo ATMI のルーチンです。実際、サービス ルーチン内で TPSVCSTART()
より先にほかの呼び出しを行うと、エラーになります。TPVCSTART()
は、サービスのパラメータおよびデータを取り出すために使用されます。このルーチンは、ルーチン TPCALL()
または TPACALL()
を介して要求を受け取るサービス、およびルーチン TPCONNECT()
、TPSEND()
および TPRECV()
を介して通信を行う会話サービスの両方に使用できます。
ルーチン TPCALL()
、TPACALL()
または TPFORWAR()
による要求を処理するサービス ルーチンは、最大 1 つの着信メッセージを受け取り (TPSVCSTART
が正常に終了したとき)、最大 1 つの応答を送ります (TPRETURN()
によってサービス ルーチンを終了したとき)。
一方、会話サービスは、最大 1 つの着信メッセージとオープン接続の参照手段とともに、接続要求により呼び出されます。TPSVCSTART()
が正常に終了すると、接続元プログラムまたは会話サービスは、アプリケーションで定義されるとおりにデータの送受信を行うことができます。この接続は半二重方式で確立されます。つまり、接続の一方の側は、他方から明示的に制御を渡されるまで、会話を制御することはできません (データを送信できません)。
トランザクションとの関連で言えば、サービス ルーチンはトランザクション モードで呼び出されると、1 つのトランザクションにしか参加できません。サービス ルーチン作成者側から見るかぎり、トランザクションはサービス ルーチンから返った時点で終了します。サービス ルーチンは、トランザクション モードで呼び出されなかった場合、TPBEGIN()
、TPCOMMIT()
および TPABORT()
を使用して必要な回数だけトランザクションを起動できます。ただし、トランザクションの終了には TPRETURN()
を使用しません。したがって、サービス ルーチン内から起動された未終了のトランザクションについて、TPRETURN()
を呼び出すと、エラーになります。
DATA-REC
は、サービスのデータが読み込まれる場所を指定し、TPTYPE-REC
内の LEN
は、DATA-REC
に移動される最大バイト数を示します。TPSVCSTART
の正常終了時には、DATA-REC
に移動された実際のバイト数が LEN
に入ります。TPTYPE-REC
内の REC-TYPE
および SUB-TYPE
にはそれぞれデータのタイプおよびサブタイプが入ります。メッセージが DATA-REC
より大きい場合は、DATA-REC
にはこのレコードに入るバイト数分のみが入ります。メッセージの残りは破棄され、TPSVCSTART()
は TPTRUNCATE()
を設定します。
正常終了時に LEN
が 0
である場合は、サービスには着信データがなく、DATA-REC
は変更されていません。入力時に LEN
を 0
にすると、エラーになります。
正常終了時には、TPSVCDEF-REC
内の SERVICE-NAME
は、要求元のプログラムがサービスの起動に使用したサービス名が入ります。
TPSVCSTART()
の終了時の TPSVCDEF-REC
設定は、次のようになります。
TPREQRSP
TPCONV
TPCONNECT()
を使用して起動されました。この会話用の通信ハンドルは、TPSVCDEF-REC
内の COMM-HANDLE
に入っています。この設定は、TPREQRSP
と相互に排他的です。
TPNOTRAN
TPTRAN
TPNOREPLY
TPREPLY
TPSENDONLY
TPCONV
が設定されている場合のみ有効です。この設定は、TPRECVONLY
と相互に排他的です。
TPRECVONLY
TPCONV
が設定されている場合のみ有効です。この設定は、TPSENDONLY
と相互に排他的です。
TPSVCDEF-REC
内の APPKEY
は、アプリケーション側で定義した認証サービスが要求クライアント プログラムに割り当てるアプリケーション キーに設定します。このキー値は、このサービス ルーチンの今回の呼び出し中になされたあらゆるサービス要求とともに渡されます。アプリケーション認証サービスを通らないクライアントを起動する場合には、APPKEY
の値は -1 になります。このようなクライアントには、保護アプリケーションとの相互運用性を有する以前のリリース レベルのクライアントがあります。
TPSVCSTART()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。着信メッセージの大きさが入力時に LEN
に指定されたより大きい場合、TPTRUNCATE()
が設定され、LEN
分のデータのみが DATA-REC
に移動されて残りのデータは破棄されます。
次の条件が発生すると、TPSVCSTART()
は異常終了し、TP-STATUS
に次の値を設定します。
TPEINVAL
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
buildserver(1)、TPBEGIN(3cbl)
、TPCALL(3cbl)
、TPCONNECT(3cbl)
、TPINITIALIZE(3cbl)
、TPOPEN(3cbl)
、TPSVRDONE(3cbl)
、TPSVRINIT(3cbl)
TPSVRDONE()
- Oracle Tuxedo ATMI のサーバ終了ルーチン
01
TPSTATUS-REC
.
COPY TPSTATUS.
PROCEDURE DIVISION.
* ユーザ コード
EXIT PROGRAM.
Oracle Tuxedo ATMI のサーバ用ルーチンは、サービス要求の処理完了後、サーバを終了する前に TPSVRDONE()
を呼び出します。このルーチンを呼び出した時点では、サーバはまだシステムの一部のままですが、それ独自のサービスは宣言から外されています。このため、このルーチンで、Oracle Tuxedo ATMI とのコミュニケーションとトランザクションの定義を行うことができます。ただし、オープンされたままの接続がある場合、保留中の非同期応答がある場合、あるいはまだトランザクション モードにある場合に TPSVRDONE()
が終了すると、Oracle Tuxedo システムはその接続をクローズし、保留中の応答を無視し、トランザクションをロールバックします。その後で、サーバは終了します。
アプリケーションがサーバにこのルーチンを提供していない場合、Oracle Tuxedo システムが提供するデフォルトのバージョンが代わりに呼び出されます。デフォルトの TPSVRDONE()
は TPCLOSE()
と USERLOG()
を呼び出し、サーバが終了することを通知します。
TPRETURN()
または TPFORWAR()
が TPSVRDONE()
において呼び出されても、これらのルーチンは何も影響を及ぼさず終了するだけです。
TPSVRINIT()
- Oracle Tuxedo ATMI のサーバ初期化ルーチン
LINKAGE SECTION.
01CMD-LINE.
05 ARGC PIC 9(4) COMP-5.
05 ARGV.
10 ARGS PIC X OCCURS 0 TO 9999 DEPENDING ON ARGC.
01TPSTATUS-REC
.
COPY TPSTATUS.
PROCEDURE DIVISION USINGCMD-LINE
TPSTATUS-REC
.
* ユーザ コード
EXIT PROGRAM
Oracle Tuxedo ATMI のサーバ用ルーチンは、その初期化処理中に TPSVRINIT()
を呼び出します。このルーチンは、プログラムがサーバになった後、サービス要求を処理する前に呼び出されます。このため、Oracle Tuxedo ATMI とのコミュニケーションとトランザクションの定義をこのルーチンで行うことができます。ただし、接続がオープン状態にあるとき、保留中の非同期応答があるとき、あるいはまだトランザクション モードにあるときに TPSVRINIT()
が戻った場合、Oracle Tuxedo システムは接続をクローズし、保留中の応答を無視し、トランザクションを中途終了させます。そして、サーバは正常に終了します。
アプリケーションがサーバにこのルーチンを提供していない場合、Oracle Tuxedo システムが提供するデフォルトのバージョンが代わりに呼び出されます。デフォルトの TPSVRINIT()
は、TPOPEN()
と USERLOG()
を呼び出して、サーバが正常に起動されたことを通知します。
アプリケーション固有のオプションをサーバに渡し、TPSVRINIT()
で処理させることができます (詳細は、「servopts(5)」を参照)。このオプションは ARGC
と ARGV
を使用して渡します。ARGC
には、渡された引数の数が入り、ARGV
には引数が入ります。引数は文字形式で指定し、引数が複数ある場合は 1 つのスペースで区切ります。getopt()
が Oracle Tuxedo システムでは使用されます。
TPSVRINIT()
が正常終了すると、TP-STATUS
に [TPOK
] が返され、サービスは要求の受け付けを開始できるようになります。TPSVRINIT
でエラーが生じた場合、アプリケーションから TP-STATUS
に [TPOK
] 以外の値を返して (サービス要求をとらずに) 正常にサーバを終了させることができます。
TPSVRINIT()
が [TPOK
] 以外の値を返した場合、サーバはシステムによって再起動されません。代わりに、管理者が tmboot
を実行してサーバを再起動する必要があります。
TPRETURN()
または TPFORWAR()
がサービス ルーチンとは別に (たとえば、クライアント、TPSVRINIT()
、TPSVRDONE()
などから) 使用されても、ルーチンは何も影響を及ぼさず終了します。
TPRETURN()
または TPFORWAR()
ルーチンが TPSVRINIT()
で呼び出されても、これらは何も影響を及ぼさずに終了します。
01
TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPTERM" USINGTPSTATUS-REC
.
TPTERM()
は、Oracle Tuxedo ATMI アプリケーションからクライアントを削除します。クライアントがトランザクション モードであると、トランザクションはロールバックされます。TPTERM()
が正常終了すると、呼び出し側は Oracle Tuxedo クライアントの操作を行えなくなります。未終了の会話はただちに切断されます。
TPTERM()
を 2 回以上呼び出した場合 (つまり、呼び出し側がアプリケーションから抜け出た後で TPTERM() を呼び出した場合)、処理は何も行われず、正常終了を示す値が返されます。
TPTERM()
が呼び出されると、プログラムは TPNULLCONTEXT
コンテキストに置かれます。TPNULLCONTEXT
コンテキストのプログラムによって呼び出される ATMI 関数のほとんどは、暗黙的 TPINITIALIZE()
を実行します。TPINITIALIZE()
の呼び出しが正常終了するかどうかは、通常の決定要因に依存し、コンテキスト固有の事柄とは無関係です。
TPTERM()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。マルチコンテキストのアプリケーションで正常終了すると、アプリケーションの現在のコンテキストは TPNULLCONTEXT
に変更されます。その後、TPSETCTXT()
を使用してコンテキストを要求に応じて変更するのは、ユーザの責任になります。
異常終了時には、TPTERM()
は -1 を返し、TP-STATUS
にエラー条件を示す値を設定します。
TPTERM()
は異常終了時には、TP-STATUS
を次のいずれかの値に設定します。
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPUNADVERTISE()
- サービス名の宣言を取り消すルーチン
01
SVC-NAME
PIC X(15).
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPUNADVERTISE" USINGSVC-NAME
TPSTATUS-REC
.
TPUNADVERTISE()
を使用すると、サーバは、宣言したサービスの宣言解除を行うことができます。デフォルトの設定では、サーバのサービスは、サーバのブート時に宣言され、サーバの停止時にその宣言が解除されます。
複数サーバ単一キュー (MSSQ) セットに属するすべてのサーバは、同じサービス セットを提供しなければなりません。これらのルーチンは、MSSQ セットを共有する全サーバを宣言することによってこの規則を適用します。
TPUNADVERTISE()
は、該当サーバ (または、呼び出し側の MSSQ セットを共有するサーバ セット) に対して宣言されたサービスとして SVC-NAME
を削除します。SVC-NAME
に SPACES
を使用することはできません。また、長さは 15 文字までとしてください (UBBCONFIG(5) の
SERVICES
セクションを参照)。これ以上の長さの名前でも受け付けられますが、15 文字以降は切り捨てられてしまいます。このため、切り捨てられた名前が他のサービス名と同じにならないよう、注意が必要です。
TPUNADVERTISE()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。
次の条件が発生すると、TPUNADVERTISE()
は異常終了し、TP-STATUS
に次の値を設定します。
TPEINVAL
]
TPENOENT
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPUNSUBSCRIBE()
- イベントのサブスクリプションの削除
01
TPEVTDEF-REC.
TPSTATUS-REC
COPY TPEVTDEF.
01 .
TPEVTDEF-REC
COPY TPSTATUS.
CALL "TPUNSUBSCRIBE" USING
TPSTATUS-REC.
呼び出し側は TPUNSUBSCRIBE()
を使用して、Oracle Tuxedo のイベント ブローカのアクティブなサブスクリプションのリストから、イベントのサブスクリプションまたはイベント サブスクリプションのセットを削除します。TPEVTDEF-REC
の SUBSCRIPTION-HANDLE
は、TPSUBSCRIBE()
から返されたイベントのサブスクリプション ハンドルです。SUBSCRIPTION-HANDLE
をワイルドカード値 -1 に設定すると、呼び出し側プロセスが以前に行った非永続的サブスクリプションをすべて削除するよう TPUNSUBSCRIBE()
に指示されます。非持続タイプのサブスクリプションとは、TPSUBSCRIBE()
を呼び出す際に TPEVNOPERSIST
をセットした状態で行ったサブスクリプションを指します。持続タイプのサブスクリプションは、TPSUBSCRIBE()
から返されたハンドルを使用することによってのみ削除できます。
「-1
」ハンドルでは、呼び出し側の直前のインスタンスによってなされたサブスクリプションではなく、この機能を呼び出しているプロセスによってなされたサブスクリプションだけが削除される点に注意する必要があります (たとえば、いったんダウンして再起動したサーバは、最初のサーバによってなされたサブスクリプションをワイルドカードを利用して削除することはできません)。
次に、TPEVTDEF-REC
の有効な設定の一覧を示します。
TPNOBLOCK
TP-STATUS
は [TPEBLOCK
] に設定されます。TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPBLOCK
TPBLOCK
がセットされ、ブロッキング条件が存在する場合は、呼び出し側はブロッキング条件が消失するか、またはタイムアウト (トランザクション タイムアウト、またはブロッキング タイムアウト) が発生するまでブロックします。TPNOBLOCK
または TPBLOCK
のいずれかが設定されていなければなりません。
TPNOTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPTIME
TPNOTIME
または TPTIME
のいずれかが設定されていなければなりません。
TPSIGRSTRT
TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
TPNOSIGRSTRT
TP-STATUS
は [TPGOTSIG
] にセットされます。TPNOSIGRSTRT
または TPSIGRSTRT
のいずれかが設定されていなければなりません。
TPUNSUBSCRIBE()
は正常終了時には、TP-STATUS
に [TPOK
] を設定します。また、TPUNSUBSCRIBE()
は、TPEVTDEF-REC
の EVENT-COUNT
に、イベント ブローカのアクティブなサブスクリプションのリストから削除したサブスクリプションの数 (値は 0 以上) を設定します。EVENT-COUNT
に 1 より大きい値がセットされるのは、ワイルドカードの "-1" というハンドルを使用した場合に限られます。また、EVENT-COUNT
には、TPUNSUBSCRIBE()
が異常終了した場合でも 0 より大きい値が設定されることがあります。つまり、ワイルドカード ハンドルを使用した場合、イベント ブローカがいくつかのサブスクリプションを正しく削除した後でエラーが発生した可能性があります。
次の条件が発生すると、TPUNSUBSCRIBE()
は異常終了し、TP-STATUS
に次のいずれかの値を設定します (特に記述した場合を除いては、エラーが呼び出し側のトランザクションに影響を及ぼすことはありません)。
TPEINVAL
]
TPENOENT
]
TPETIME
]
TPBLOCK
と TPTIME
の両方が指定された場合にのみ発生します。
TPETIME
が発生します。ただし、例外が 1 つあります。例外は、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションのために送信されない要求 (つまり、TPNOTRAN
、TPNOBLOCK
、および TPNOREPLY
が設定された状態で TPACALL()
が呼び出される場合) です。
TX_ROLLBACK_ONLY
状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME
で異常終了します (前の段落で説明した例外を除く)。
TPEBLOCK
]
TPGOTSIG
]
TPEPROTO
]
TPESYSTEM
]
TPEOS
]
TPPOST(3cbl)
、TPSUBSCRIBE(3cbl)
、EVENTS(5)、EVENT_MIB(5), TMSYSEVT(5)、TMUSREVT(5)
01
TX-RETURN-STATUS
.
COPY TXSTATUS.
CALL "TXBEGIN" USING TX-RETURN-STATUS
.
TXBEGIN()
は、呼び出し側の制御スレッドをトランザクション モードにする際に使用します。呼び出し側のスレッドは、トランザクションを開始する前に、リンクされているリソース マネージャが (TXOPEN()
を介して) オープンされていることを、まず第 1 に確実にしなければなりません。呼び出し側が既にトランザクション モードにある場合、または TXOPEN()
が呼び出されていない場合、TXBEGIN
は異常終了します (TX-STATUS
に値 [TX-PROTOCOL-ERROR
] が設定されます)。
トランザクション モードに入ると、呼び出し側のスレッドは、現在のトランサクションを完了させるために、TXCOMMIT()
または TXROLLBACK()
を呼び出さなければなりません。トランザクションの連鎖に関連する条件によっては、トランザクションを開始する際に TXBEGIN()
を明示的に呼び出す必要がないこともあります。詳細は TXCOMMIT()
および TXROLLBACK()
を参照してください。戻り値に使用されるレコードは、TX-RETURN-STATUS
です。
TXBEGIN()
は正常終了時には、負数でない値 TX-OK
を返します。
次の条件が発生すると、TXBEGIN()
は異常終了し、次のいずれかの負の値を返します。
TX-OUTSIDE
]
TX-PROTOCOL-ERROR
]
TX-ERROR
]
TX-FAIL
]
TXCOMMIT(3cbl)
、TXOPEN(3cbl)
、TXROLLBACK(3cbl)
、TXSETTIMEOUT(3cbl)
XA 準拠のリソース マネージャがグローバル トランザクションに含まれるようにするには、そのリソース マネージャが正常にオープンされている必要があります (詳細は、TXOPEN
を参照)。
TXCLOSE()
- リソース マネージャ セットのクローズ
DATA DIVISION.
* TX 定義のインクルード
01TX-RETURN-STATUS
.
COPY TXSTATUS.
PROCEDURE DIVISION.
CALL "TXCLOSE" USINGTX-RETURN-STATUS
.
TXCLOSE()
は、移植生の高い方法でリソース マネージャ セットをクローズします。これにより、トランザクション マネージャが呼び出されて、リソース マネージャ固有の情報がトランザクション マネージャ固有の方法で読み取られ、この情報が呼び出し側にリンクされたリソース マネージャに渡されます。
TXCLOSE()
は、呼び出し側にリンクされているリソース マネージャをすべてクローズします。この関数は、リソース マネージャ固有の「クローズ」呼び出しの代わりに使用されるので、アプリケーション プログラムは、移植性を損なう危険性のある呼び出しを使用することがなくなります。リソース マネージャは終了の内容がそれぞれで異なるため、個々のリソース マネージャを「クローズ」するために必要な情報をリソース マネージャごとに通知しなければなりません。
TXCLOSE()
は、アプリケーションの制御スレッドがグローバル トランザクションに関与する必要がなくなったときに呼び出してください。呼び出し側がトランザクション モードにあると、TXCLOSE()
は異常終了します ([TX-PROTOCOL-ERROR
] が返されます)。したがって、現在のトランザクションに関与しない制御スレッドがあっても、リソース マネージャは一切クローズされません。
TXCLOSE()
が正常終了すると (TX-OK
)、呼び出し側のスレッドにリンクしているリソース マネージャはすべてクローズされます。
戻り値に使用されるレコードは、TX-RETURN-STATUS
です。
TXCLOSE()
は正常終了時には、負数でない値 TX-OK
を返します。
次の条件が発生すると、TXCLOSE()
は異常終了し、次のいずれかの負の値を返します。
TX-PROTOCOL-ERROR
]
TX-ERROR
]
TX-FAIL
]
DATA DIVISION.
* TX 定義のインクルード
01TX-RETURN-STATUS
.
COPY TXSTATUS.
PROCEDURE DIVISION.
CALL "TXCOMMIT" USINGTX-RETURN-STATUS
.
TXCOMMIT()
は、呼び出し側の制御スレッドでアクティブなトランザクションの作業をコミットします。
transaction_control
特性 (TXSETTRANCTL()
を参照) が TX-UNCHAINED
の場合、TXCOMMIT()
が終了すると、呼び出し側はトランザクション モードでなくなります。一方、transaction_control
特性が TX-CHAINED
の場合は、TXCOMMIT()
が終了したとき、呼び出し側は新しいトランザクションのためにトランザクション モードのままになります (以下の「戻り値」と「エラー」の項を参照してください)。
戻り値に使用されるレコードは、TX-RETURN-STATUS
です。
TXCOMMIT()
は正常終了時には、負数でない値 TX-OK
を返します。
次の条件が発生すると、TXCOMMIT()
は異常終了し、次のいずれかの負の値を返します。
TX-NO-BEGIN
]
transaction_control
特性が TX-CHAINED
である場合のみ発生します。
TX-ROLLBACK
]
TX-ROLLBACK-NO-BEGIN
]
transaction_control
特性が TX-CHAINED
である場合のみ発生します。
TX-MIXED
]
transaction_control
特性が TX-CHAINED
である場合には、新しいトランザクションが開始されます。
TX-MIXED-NO-BEGIN
]
transaction_control
特性が TX-CHAINED
である場合のみ発生します。
TX-HAZARD
]
transaction_control
特性が TX-CHAINED
である場合には、新しいトランザクションが開始されます。
TX-HAZARD-NO-BEGIN
]
transaction_control
特性が TX-CHAINED
である場合のみ発生します。
TX-PROTOCOL-ERROR
]
TX-FAIL
]
TXBEGIN(3cbl)
、TXSETCOMMITRET(3cbl)
、TXSETTIMEOUT(3cbl)
、TXSETTRANCTL(3cbl)
TXINFORM()
- グローバル トランザクション情報を返す
DATA DIVISION.
* TX 定義のインクルード
01TX-RETURN-STATUS
.
COPY TXSTATUS.
01TX-INFO-AREA
.
COPY TXINFDEF.
PROCEDURE DIVISION.
CALL "TXINFORM" USINGTX-INFO-AREA, TX-RETURN-STATUS
.
TXINFORM()
は、グローバル トランザクション情報を TX-INFO-AREA
に返します。また、この関数は、呼び出し側が現在トランザクション モードにあるかどうかを示す値も返します。
TXINFORM()
は、TX-INFO-AREA
レコードにグローバル トランザクション情報を入れます。TX-INFO-AREA
レコードの内容は INTRO()
で説明しています。
TXINFORM
がトランザクション モードにおいて呼び出されると、TX-IN-TRAN
が設定され、XID-REC
に現在のトランザクションのブランチ識別子が、TRANSACTION-STATE
に現在のトランザクションの状態が入ります。呼び出し側がトランザクション モードにない場合は、TX-NOT-IN-TRAN
が設定され、XID-REC
に NULL XID が入ります (詳細は、TXINTRO
を参照)。呼び出し側がトランザクション モードにあるかどうかに関係なく、COMMIT-RETURN
、TRANSACTION-CONTROL
および TRANSACTION-TIMEOUT
に commit_return
および transaction_control
特性の現在の設定、および秒単位のトランザクション タイムアウト値が入ります。
返されるトランザクション タイムアウト値は、次のトランザクション開始時に使用される設定を反映しています。したがって、この値は、呼び出し側の現在のグローバル トランザクションのタイムアウト値を反映しているわけではありません。現在のトランザクション開始後に行われた TXSETTIMEOUT()
の呼び出しによって、この値が変更されていることがあるからです。
戻り値に使用されるレコードは、TX-RETURN-STATUS
です。
TXINFORM()
は正常終了時には、負数でない値 TX-OK
を返します。
次の条件が発生すると、TXINFORM()
は異常終了し、次のいずれかの負の値を返します。
TX-PROTOCOL-ERROR
]
TX-FAIL
]
TXOPEN(3cbl)
、TXSETCOMMITRET(3cbl)
、TXSETTIMEOUT(3cbl)
、TXSETTRANCTL(3cbl)
同一のグローバル トランザクション内では、TXINFORM
の後の呼び出しは、XID に同一の gtrid
構成要素を指定することが保証されますが、同一の bqual
構成要素の指定は必ずしも保証されません。
TXOPEN()
- リソース マネージャ セットのオープン
DATA DIVISION.
* TX 定義のインクルード
01TX-RETURN-STATUS
.
COPY TXSTATUS.
PROCEDURE DIVISION.
CALL "TXOPEN" USINGTX-RETURN-STATUS
.
TXOPEN()
は、移植生の高い方法でリソース マネージャ セットをオープンします。これにより、トランザクション マネージャが呼び出されて、リソース マネージャ固有の情報がトランザクション マネージャ固有の方法で読み取られ、この情報が呼び出し側にリンクされたリソース マネージャに渡されます。
TXOPEN()
は、アプリケーションにリンクされたすべてのリソース マネージャをオープンしようとします。この関数は、リソース マネージャ固有の「オープン」呼び出しの代わりに使用されるので、アプリケーション プログラムは、移植性を損なう可能性のある呼び出しを使用することがなくなります。リソース マネージャは開始の内容がそれぞれで異なるため、個々のリソース マネージャを「オープン」するために必要な情報をリソース マネージャごとに通知しなければなりません。
TXOPEN()
が TX-ERROR
を返した場合、リソース マネージャは一切オープンされません。TXOPEN()
が TX-OK
を返した場合は、リソース マネージャの一部または全部がオープンされています。オープンされなかったリソース マネージャは、アプリケーションによってアクセスされるときに、リソース マネージャ固有のエラーを返します。TXOPEN()
は、制御スレッドがグローバル トランザクションに関与する前に、正常に終了しなければなりません。
TXOPEN()
が正常終了した後で (TXCLOSE()
を呼び出す前に)、TXOPEN
を呼び出すことは可能です。このような後続の呼び出しは、正常終了しますが、トランザクション マネージャは、リソース マネージャの再オープンは一切行いません。
戻り値に使用されるレコードは、TX-RETURN-STATUS
です。
TXOPEN()
は正常終了時には、負数でない値 TX-OK
を返します。
次の条件が発生すると、TXOPEN()
は異常終了し、次のいずれかの負の値を返します。
TX-ERROR
]
TX-FAIL
]
TXROLLBACK()
- トランザクションのロールバック
DATA DIVISION.
* TX 定義のインクルード
01TX-RETURN-STATUS
.
COPY TXSTATUS.
PROCEDURE DIVISION.
CALL "TXROLLBACK" USINGTX-RETURN-STATUS
.
TXROLLBACK()
は、呼び出し側の制御スレッドでアクティブなトランザクションの作業をロールバックします。
transaction_control
特性 (TXSETTRANCTL()
を参照) が TX-UNCHAINED
の場合、TXROLLBACK()
が終了すると、呼び出し側はトランザクション モードでなくなります。一方、transaction_control
特性が TX-CHAINED
の場合は、TXROLLBACK()
が終了したとき、呼び出し側は新しいトランザクションのためにトランザクション モードのままになります (以下の「戻り値」と「エラー」の項を参照してください)。
戻り値に使用されるレコードは、TX-RETURN-STATUS
です。
TXROLLBACK()
は正常終了時には、負数でない値 TX-OK
を返します。
次の条件が発生すると、TXROLLBACK()
は異常終了し、次のいずれかの負の値を返します。
TX-NO-BEGIN
]
transaction_control
特性が TX-CHAINED
である場合のみ発生します。
TX-MIXED
]
transaction_control
特性が TX-CHAINED
である場合には、新しいトランザクションが開始されます。
TX-MIXED-NO-BEGIN
]
transaction_control
特性が TX-CHAINED
である場合のみ発生します。
TX-HAZARD
]
transaction_control
特性が TX-CHAINED
である場合には、新しいトランザクションが開始されます。
TX-HAZARD-NO-BEGIN
]
transaction_control
特性が TX-CHAINED
である場合のみ発生します。
TX-COMMITTED
]
transaction_control
特性が TX-CHAINED
である場合には、新しいトランザクションが開始されます。
TX-COMMITTED-NO-BEGIN
]
transaction_control
特性が TX-CHAINED
である場合のみ発生します。
TX-PROTOCOL-ERROR
]
TX-FAIL
]
TXBEGIN(3cbl)
、TXSETTIMEOUT(3cbl)
、TXSETTRANCTL(3cbl)
TXSETCOMMITRET()
- commit_return
特性の設定
DATA DIVISION.
* TX 定義のインクルード
01TX-RETURN-STATUS
.
COPY TXSTATUS.
*
01TX-INFO-AREA
.
COPY TXINFDEF.
PROCEDURE DIVISION.
CALL "TXSETCOMMITRET" USINGTX-INFO-AREA TX-RETURN-STATUS
.
TXSETCOMMITRET()
は、COMMIT-RETURN
で指定されている値を commit_return
特性に設定します。この特性は、TXCOMMIT()
が呼び出し側に制御を返す際の動作方法に影響します。TXSETCOMMITRET()
は、呼び出し側がトランザクション モードにあるかどうかに関係なく、呼び出すことが可能です。この設定は、TXSETCOMMITRET()
がこの後で呼び出されて変更されるまで、有効です。
この特性の初期設定は TX-COMMIT-COMPLETED
です。
TX-COMMIT-DECISION-LOGGED
TXCOMMIT()
が終了することを示します。このフラグを設定すると、TXCOMMIT()
の呼び出し側に高速で応答することができます。しかし、トランザクションがヒューリスティックな結果を得る危険があります。この場合、TXCOMMIT()
の戻りコードから呼び出し側がこの状況を知ることはできません。正常な状態では、第 1 フェーズの間にコミットすることを約束している参加リソースは、第 2 フェーズでコミットします。ただし、ある特殊な条件下においては (たとえば、長時間継続しているネットワークやノードの障害など)、第 2 フェーズで行うことができずにヒューリスティックな結果が生じることがあります。
TX-COMMIT-COMPLETED
TXCOMMIT()
が終了することを示します。このフラグを設定すると、TXCOMMIT()
の呼び出し側は、トランザクションがヒューリスティックな結果を得たこと、または得ていた可能性があることを戻りモードから知ることができます。
戻り値に使用されるレコードは、TX-RETURN-STATUS
です。
TXSETCOMMITRET()
は正常終了時には、負数でない値 TX-OK
を返します。
次の条件が発生すると、TXSETCOMMITRET()
は commit_return
特性の設定を変更せずに次のいずれかの負の値を返します。
TX-EINVAL
]
TX-PROTOCOL-ERROR
]
TX-FAIL
]
TXBEGIN(3cbl)
、TXCOMMIT(3cbl)
、TXINFORM(3cbl)
、TXOPEN(3cbl)
、TXROLLBACK(3cbl)
TXSETTRANCTL()
- transaction_control
特性の設定
DATA DIVISION.
* TX 定義のインクルード
01TX-RETURN-STATUS
.
COPY TXSTATUS.
01TX-INFO-AREA
.
COPY TXINFDEF.
PROCEDURE DIVISION.
CALL "TXSETTRANCTL" USINGTX-INFO-AREA, TX-RETURN-STATUS
.
TXSETTRANCTL()
は、TRANSACTION-CONTROL
で指定されている値を transaction_control
特性に設定します。この特性は、TXCOMMIT()
および TXROLLBACK()
が、呼び出し側に制御を返す前に新しいトランザクションを開始するかどうかを決定します。TXSETTRANCTL()
は、アプリケーション プログラムがトランザクション モードであるかどうかに関係なく、呼び出すことができます。この設定は、TXSETTRANCTL()
がこの後で呼び出されて変更されるまで、有効です。
TRANSACTION-CONTROL
の有効な設定を次に示します。
TX-UNCHAINED
TXCOMMIT()
および TXROLLBACK()
が、呼び出し側に制御を返す前に新しいトランザクションを開始しないことを示します。呼び出し側は、新しいトランザクションを開始するには、TXBEGIN()
を発行しなければなりません。
TX-CHAINED
TXCOMMIT()
および TXROLLBACK()
が、呼び出し側に制御を返す前に新しいトランザクションを開始することを示します。
TX-RETURN-STATUS
です。
TXSETTRANCTL()
は正常終了時には、負数でない値 TX-OK
を返します。
次の条件が発生すると、TXSETTRANCTL()
は transaction_control
特性の設定を変更せずに次のいずれかの負の値を返します。
TX-EINVAL
]
TX-PROTOCOL-ERROR
]
TX-FAIL]
TXBEGIN(3cbl)
、TXCOMMIT(3cbl)
、TXOPEN(3cbl)
、TXROLLBACK(3cbl)
、TXINFORM(3cbl)
TXSETTIMEOUT()
- transaction_timeout
特性の設定
DATA DIVISION.
* TX 定義のインクルード
01TX-RETURN-STATUS
.
COPY TXSTATUS.
*
01TX-INFO-AREA
.
COPY TXINFDEF.
PROCEDURE DIVISION.
CALL "TXSETTIMEOUT" USINGTX-INFO-AREA TX-RETURN-STATUS
.
TXSETTIMEOUT()
は、TRANSACTION-TIMEOUT
で指定されている値を transaction_timeout
特性に設定します。この値は、トランザクションがトランザクション タイムアウトの対象になる前に完了しなければならない制限時間を指定します。この時間は、AP 呼び出し TXBEGIN()
と TXCOMMIT()
または TXROLLBACK()
の間の時間になります。TXSETTIMEOUT()
は、呼び出し側がトランザクション モードであるかどうかに関係なく呼び出すことができます。TXSETTIMEOUT()
がトランザクション モードで呼び出された場合、新しいタイムアウト値は、次のトランザクションまでは無効です。
transaction_timeout
の初期値は 0 (タイムアウトなし) です。
TRANSACTION-TIMEOUT
は、トランザクションがトランザクション タイムアウトの対象となるまでの秒数を指定します。この値には、S9(9) COMP-5
にシステムで定義されている最大値までの任意の値を設定できます。TRANSACTION-TIMEOUT
値ゼロの場合、タイムアウト機能はオフになります。
戻り値に使用されるレコードは、TX-RETURN-STATUS
です。
TXSETTIMEOUT()
は正常終了時には、負数でない値 TX-OK
を返します。
次の条件が発生すると、TXSETTIMEOUT()
は transaction_timeout
特性の設定を変更せずに次のいずれかの負の値を返します。
TX-EINVAL
]
TX-PROTOCOL-ERROR
]
TX-FAIL
]
TXBEGIN(3cbl)
、TXCOMMIT(3cbl)
、TXINFORM(3cbl)
、TXOPEN(3cbl)
、TXROLLBACK(3cbl)
USERLOG()
- Oracle Tuxedo ATMI の中央イベント ログへのメッセージの書き込み
01
LOG-REC
.
COPY User data.
01LOGREC-LEN
PIC S9(9) COMP-5.
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "USERLOG" USINGLOG-REC
LOGREC-LEN
TPSTATUS-REC
.
USERLOG()
は、固定出力ファイル (Oracle Tuxedo ATMI の中央イベント ログ) に LOG-REC
を書き込みます。
中央のイベント ログは通常の UNIX システム ファイルで、そのパス名は次のように構成されています。
このあと、メッセージがそのファイルに追加されます。この方法の場合、それ以降の日に USERLOG()
をプロセスを呼び出すと、メッセージは別のファイルに書き込まれます。
hhmmss
)、システム名、プロセス名、呼び出しプロセスのプロセス ID からなるタグと一緒にログ ファイルに書き込まれる。このタグの末尾にはコロン (:
) が付けられる。catalog>:number>:
format
指定の最後の文字が改行文字でない場合、USERLOG()
は改行文字を 1 つ追加する。ULOGDEBUG
の先頭文字が 1
または y
であると、USERLOG()
に送られるメッセージは、呼び出しプロセスの標準エラー出力にも書き出される。USERLOG()
は、Oracle Tuxedo システムが各種のイベントを記録するために使用する。USERLOG
の機構は、トランザクション記録機構とは完全に独立している。
USERLOG
インタフェースは、UNIX および MS-DOS オペレーティング システムで利用できます。ログ メッセージの一部として生成されるシステム名は、MS-DOS システムでは利用できません。このため、MS-DOS システムのシステム名としては、値 PC
を使用します。
変数 ULOGPFX
が /application/logs/log
に設定されている場合、および USERLOG()
の最初の呼び出しが 9/7/90 に行われた場合、作成されるログ ファイルには /application/logs/log.090790
という名前が付けられます。たとえば、
01
LOG-REC
PIC X(15) VALUE “UNKNOWN USER”.
01LOGREC-LEN
PIC S9(9) VALUES IS 13.
CALL “USERLOG” USINGLOG-REC
LOGREC-LEN
TPSTATUS-REC
.
上記のような呼び出しが、プロセス ID が 23431
であるプログラムにより UNIX システムが指定した logsys
上で 4:22:14pm に出された場合は、ログ ファイルには次のような行が書き込まれます。
162214.logsys!security.23431: UNKNOWN USER
プロセスがトランザクション モードのときにメッセージが中央イベント ログに送られた場合、ユーザ ログ エントリのタグに追加の要素が加わります。これらの要素は、リテラル gtrid
と、それに続く 3 桁の PIC S9(9) COMP-5
の 16 進整数で構成されます。これらの値はグローバル トランザクションをユニークに識別し、グローバル トランザクション識別子と呼ばれます。この識別子は主に管理上の目的で使用されますが、中央イベント ログでメッセージの先頭に付けられるタグの中に付けられます。前述のメッセージがトランザクション モードで中央イベント ログに書き出される場合、結果として得られるログ エントリは次のようになります。
162214.logsys!security.23431: gtrid x2 x24e1b803 x239: UNKNOWN USER
シェル変数 ULOGDEBUG
の値が y
であると、ログ メッセージはプログラム security
の標準エラー出力にも書き出されます。
USERLOG()
は、送信されるメッセージが stdio.h
で定義されている BUFSIZ
より大きい場合はハングします。
USERLOG()
が返す値には、現在のログ ファイルのオープンや書き込みができないことを示す値も含まれます。ULOGDEBUG
が設定されている場合、標準エラー出力への書き込みができない場合は、エラーとは見なされません。
アプリケーションで USERLOG
メッセージを使用する場合には、アプリケーション エラーをデバッグするのに有用なものだけを使用することをお勧めします。ログが情報であふれてしまうと、本来のエラーを検出するのが難しくなります。