![]() ![]() ![]() ![]() ![]() ![]() |
アプリケーション・トランザクション・モニター・インタフェース(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()
を介して最終的な応答が送信された時点で終了します。
接続が確立されると、通信ハンドルは参加者のためのアドレッシング情報に関して必要となる任意のコンテキストを暗示します。メッセージは、アプリケーション側の規定に従って送受信することができます。リクエスト・メッセージ応答メッセージとの間には本質的な相違はなく、またメッセージの優先度に関する規定もありません。
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 ATMI C関数リファレンス』の「C言語アプリケーション・トランザクション・モニター・インタフェースについて」を参照してください。TPTYPE-REC
内のREC-TYPE
によって、アプリケーションで送信または受信しようとするレコード・タイプを選択します。さらに細かい分類が必要な場合には、TPTYPE-REC
内のSUB-TYPE
も指定しなければなりません(たとえば、VIEWレコードなど)。TPTYPE-REC
内のLEN
によって、送信時には送信するバイト数を示し、受信時にはユーザーのレコードに移動するバイト数を示します。サポートされるREC-TYPE
は次のとおりです。
CARRAY
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 ATMI 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は、クライアント・プロセス内で発生する、非初期化状態、シングル・コンテキスト・モードで初期化された状態、およびマルチコンテキスト・モードで初期化された状態の遷移を示しています。
上記のように定義されたクライアント/サーバー間でのやりとりの境界外からメッセージをアプリケーション・クライアントに送る方法は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(127).
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(127).
05 QSPACE-NAME PIC X(127).
05 REPLYQUEUE PIC X(127).
05 FAILUREQUEUE PIC X(127).
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(127).
05 NAME-2 PIC X(127).
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.
*
* TXSTATUS.cbl
*
05 TX-STATUS PIC S9(9) COMP-5.
88 TX-NOT-SUPPORTED VALUE 1.
* Normal execution
88 TX-OK VALUE 0.
* Normal execution
88 TX-OUTSIDE VALUE -1.
* Application is in an RM local transaction
88 TX-ROLLBACK VALUE -2.
* Transaction was rolled back
88 TX-MIXED VALUE -3.
* Transaction was partially committed and partially
* rolled back
88 TX-HAZARD VALUE -4.
* Transaction may have been partially committed and
* partially rolled back
88 TX-PROTOCOL-ERROR VALUE -5.
* Routine invoked in an improper context
88 TX-ERROR VALUE -6.
* Transient error
88 TX-FAIL VALUE -7.
* Fatal error
88 TX-EINVAL VALUE -8.
* Invalid arguments were given
88 TX-COMMITTED VALUE -9.
* The transaction was heuristically committed
88 TX-NO-BEGIN VALUE -100.
* Transaction committed plus new transaction could not
* be started
88 TX-ROLLBACK-NO-BEGIN VALUE -102.
* Transaction rollback plus new transaction could not
* be started
88 TX-MIXED-NO-BEGIN VALUE -103.
* Mixed plus new transaction could not be started
88 TX-HAZARD-NO-BEGIN VALUE -104.
* Hazard plus new transaction could not be started
88 TX-COMMITTED-NO-BEGIN VALUE -109.
* Heuristically committed plus transaction could not
* be started
TXINFDEF
レコードは、TXINFORM()
コールの結果が格納されるデータ構造体を定義します。
*
* TXINFDEF.cbl
*
05 XID-REC.
* XID record
10 FORMAT-ID PIC S9(9) COMP-5.
* A value of -1 in FORMAT-ID means that the XID is 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.
* Transaction mode settings
88 TX-NOT-IN-TRAN VALUE 0.
88 TX-IN-TRAN VALUE 1.
05 COMMIT-RETURN PIC S9(9) COMP-5.
* Commit_return settings
88 TX-COMMIT-COMPLETED VALUE 0.
88 TX-COMMIT-DECISION-LOGGED VALUE 1.
05 TRANSACTION-CONTROL PIC S9(9) COMP-5.
* Transaction_control settings
88 TX-UNCHAINED VALUE 0.
88 TX-CHAINED VALUE 1.
05 TRANSACTION-TIMEOUT PIC S9(9) COMP-5.
* Transaction_timeout value
88 NO-TIMEOUT VALUE 0.
05 TRANSACTION-STATE PIC S9(9) COMP-5.
* Transaction_state information
88 TX-ACTIVE VALUE 0.
88 TX-TIMEOUT-ROLLBACK-ONLY VALUE 1.
88 TX-ROLLBACK-ONLY VALUE 2.
Oracle Tuxedoシステムは、各プログラムの状態を記録し、各種の関数呼び出しやオプションごとに正当な状態遷移が行われているかどうかを検証します。この状態情報には、プログラムのタイプ(リクエスト/レスポンス型サーバー、会話サーバー、またはクライアント)、初期化状態(初期化済み、非初期化)、リソースの管理状態(クローズまたはオープン)、プログラムのトランザクション状態およびすべての非同期リクエスト/レスポンスおよび接続ハンドルの状態などがあります。不当な状態遷移が行われようとすると、呼び出された関数は異常終了し、TPSTATUS-REC
にTPEPROTO()
が設定されます。この情報に関する正規の状態と遷移について、次の表に示します。
表3は、リクエスト/レスポンス型サーバー、会話型サーバーおよびクライアントがどの関数を呼び出すことができるかを示しています。ただし、TPSVRINIT()
とTPSVRDONE()
はこの表には示してありません。これらの関数はアプリケーションからは呼び出されないためです。これらはアプリケーションが提供する関数ですが、Oracle Tuxedoシステムによって呼び出されます。
以下に示す表は、特に明記されていないかぎり、クライアントとサーバー両方に適用されます。なお、関数によってはクライアントとサーバーの両方が呼び出せるわけではないので(たとえばTPINITIALIZE()
)、以下の状態遷移のなかには、両方のプログラム・タイプには適用できないものもあります。上記の表を参照して、目的のプログラムから特定の関数を呼び出すことができるかどうかを判断するようにしてください。
表 4は、クライアント・プログラムがトランザクション・マネージャで初期化され登録されているかどうかを示しています。この表では、TPINITIALIZE()
を使用しているものとします。TPINITIALIZE()は、シングル・コンテキスト・モードでは任意選択可能です。つまり、シングル・コンテキストのクライアントは、多数のATMI関数のどれか(たとえば、TPACALL()
またはTPCALL()
)を発行することによって、暗黙的にアプリケーションに参加することができます。次のいずれかに該当する場合、クライアントはTPINITIALIZE()
を使用する必要があります。
TPINITIALIZE()
および「UBBCONFIG(5)」のSECURITY
キーワードの説明を参照)「TPINITIALIZE(3cbl)」
を参照) サーバーはTPSVRINIT()
関数が呼び出される前にOracle Tuxedoディスパッチャによって初期化状態になり、TPSVRDONE()
関数が返された後、Oracle Tuxedoディスパッチャによって非初期化状態になります。なお、下記のすべての表において、関数がエラーを起こした場合、特に明記されていないかぎり、プログラムの状態は変わりません。
表4は、初期化状態を示しています。
以降の表は、(TPINITIALIZE()
、TPSETCTXT()
、またはOracle Tuxedoのサービス・ディスパッチャを介してこの状態でプログラムが到着したかどうかに関わりなく)事前条件として状態がI1であると想定しています。
表5は、クライアントまたはサーバーに対応するリソース・マネージャが初期化されているかいないかに応じてクライアントまたはサーバーの状態を示しています。
表6は、プログラムがトランザクションに対応しているかどうかに関してそのプログラムの状態を示したものです。サーバーの場合、状態T1とT2への遷移は、事前条件として状態R1を想定しています(たとえば、TPOPEN()
はそれ以降TPCLOSE()
またはTPTERM()
への呼出しがないものとして呼び出されています)。
表7は、TPACALL()
が戻す1つのリクエスト・ハンドルの状態を示すものです。
注意: | a この状態遷移は、記述子が呼出し側のトランザクションに関連付けられていない場合にのみ発生します。 |
注意: | b この状態遷移は、記述子が呼出し側のトランザクションに関連付けられている場合にのみ発生します。 |
注意: | c記述子が呼出し側のトランザクションに関連する場合、TPSUSPEND() はプロトコル・エラーを戻します。 |
表8は、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」でサブタイプはありません)場合を除いて、レコードを解釈してはなりません。
FINIT()
は正常終了時には、FML-REC
内のFML-STATUS
にFOK
を設定します。
エラーが発生した場合は、FML-STATUS
は0以外の値に設定されます。
次の条件が発生すると、FINIT()
は異常終了し、FML-REC
内のFML-STATUS
に次の値を設定します。
[FALIGNERR
]
FNOSPACE
]
バッファからフィールドを削除する再初期化のための正しい方法を以下に示します。Finit
(frfr
, (FLDLEN
)Fsizeof
(fbfr
));
『Oracle Tuxedo ATMI 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 ATMI 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()
は、C構造体からフィールド化バッファにデータを転送します。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 ATMI 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
が設定されている場合には、TPCALL()
は、COMM-HANDLE
に通信ハンドルを返します。このハンドルは、送信したリクエストに対する応答を受信する際に使用できる有効なハンドルです。
次の条件が発生すると、TPACALL()
は失敗し、TP-STATUS
に次の値を設定します。特に説明がなければ、この障害は呼出し側のトランザクションには影響しません。
TPEINVAL
]
TPENOENT
]
TPEITYPE
]
TPELIMIT
]
TPETRAN
]
TPETIME
]
TPBLOCK
とTPTIME
の両方が指定された場合にのみ発生します。) トランザクション・タイムアウトが発生した場合、トランザクションがアボートされない限り、新しいリクエストの送信や未処理の応答の受信はできず、TPETIME
が発生します。例外は、ブロックされず、応答を期待せず、かつ呼出し側のトランザクションのために送信されないリクエスト(つまり、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(127).
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
の長さは127文字以内にしてください。これに、SPACES
を指定することはできません。(「UBBCONFIG(5)」のSERVICES
の項を参照。)これより長い名前は127文字に切り詰められます。ユーザーは、切り詰められた名前が他のサービス名と同じにならないように注意する必要があります。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
が属しており、呼出し側がトランザクション・モードにある場合は、この設定を指定しなければなりません。この値がtrue
に設定されたトランザクション・モードの呼出し側には、トランザクション・タイムアウトが適用されます。それ以外は適用されません。この設定を使用した状態で呼び出されたサービスが正常に実行できない場合、呼出し側のトランザクションは影響を受けません。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
が、そのサービスから送られた応答のタイプおよびサブタイプと一致しません。OTPTYPE-REC
のODATA-REC
もLEN
も変更されません。サービス・リクエストが呼出し側の現在のトランザクションの一部として発行されると、応答が破棄されるので、そのトランザクションは中断のみとマークされます。
TPETRAN
]
TPETIME
]
TPBLOCK
とTPTIME
の両方が指定された場合にのみ発生します。)いずれの場合でも、ODATA-REC
もOTPTYPE-REC
も変更されません。 トランザクション・タイムアウトが発生した場合、トランザクションがアボートされない限り、新しいリクエストの送信や未処理の応答の受信はできず、TPETIME
が発生します。例外は、ブロックされず、応答を期待せず、かつ呼出し側のトランザクションのために送信されないリクエスト(つまり、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
が発生します。例外は、ブロックされず、応答を期待せず、かつ呼出し側のトランザクションのために送信されないリクエスト(つまり、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
true
に設定されたトランザクション・モードの呼出し側には、トランザクション・タイムアウトが適用されます。それ以外は適用されません。この設定を使用した状態で呼び出されたキューからのメッセージの取出しに失敗した場合、呼出し側のトランザクションは影響されません。TPNOTRAN
またはTPTRAN
のいずれかが設定されていなければなりません。
TPTRAN
TPNOTRAN
またはTPTRAN
のいずれかが設定されていなければなりません。
TPNOBLOCK
TPNOBLOCK
を設定した場合、メッセージの転送先である内部バッファがいっぱいであるなどのブロッキング状態が存在すると、呼出しは異常終了し、TP-STATUS
にTPEBLOCK
が設定されます。TPNOBLOCK
を設定し、ターゲット・キューが別のアプリケーションによって排他的にオープンされているというブロッキング状態が存在する場合、呼出しは異常終了し、TP-STATUS
にTPEDIAGNOSTIC
が設定され、TPQUEDEF
レコードのDIAGNOSTIC
フィールドにQMESHARE
が設定されます。後者の場合、Oracle Tuxedoシステム以外のOracle製品に基づくほかのアプリケーションが、キューイング・サービス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(127).
05 FAILUREQUEUE PIC X(127).
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
が発生します。例外は、ブロックされず、応答を期待せず、かつ呼出し側のトランザクションのために送信されないリクエスト(つまり、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
の両方が指定された場合にのみ発生します。 トランザクション・タイムアウトが発生すると、1つの例外を除き、トランザクションが中断されないかぎり、会話を継続したり、新しいリクエストを送信したり、未処理の応答を受信しようとしても、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
true
に設定されたトランザクション・モードの呼出し側には、トランザクション・タイムアウトが適用されます。それ以外は適用されません。この設定を使用した状態で呼び出されたキューへのメッセージの登録に失敗した場合、呼出し側のトランザクションは影響されません。TPNOTRAN
またはTPTRAN
のいずれかが設定されていなければなりません。
TPTRAN
TPNOTRAN
またはTPTRAN
のいずれかが設定されていなければなりません。
TPNOBLOCK
TPNOBLOCK
を設定した場合、メッセージの転送先である内部バッファがいっぱいであるなどのブロッキング状態が存在すると、呼出しは異常終了し、TP-STATUS
にTPEBLOCK
が設定されます。TPNOBLOCK
を設定し、ターゲット・キューが別のアプリケーションによって排他的にオープンされているというブロッキング状態が存在する場合、呼出しは異常終了し、TP-STATUS
にTPEDIAGNOSTIC
が設定され、TPQUEDEF
レコードのDIAGNOSTIC
フィールドにQMESHARE
が設定されます。後者の場合、Oracle Tuxedoシステム以外のOracle製品に基づくほかのアプリケーションが、キューイング・サービス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(127).
05 FAILUREQUEUE PIC X(127).
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
のいずれかを設定しなければなりません。
また、APPL-RETURN-CODE
にユーザー戻り値を設定することができます。この値は、メッセージをキューから取り出すアプリケーションに戻されます。
TPENQUEUE()
からの出力時には、次の要素がTPQUEDEF-REC
に設定されます。
05 MSGID PIC X(32).
05 DIAGNOSTIC PIC S9(9) COMP-5.
TPENQUEUE()
からの出力情報を制御するTPQUEDEF-REC
の有効な設定を次に示します。TPENQUEUE()
の呼出し時にこの設定が真の場合、/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
が発生します。例外は、ブロックされず、応答を期待せず、かつ呼出し側のトランザクションのために送信されないリクエスト(つまり、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
が発生します。例外は、ブロックされず、応答を期待せず、かつ呼出し側のトランザクションのために送信されないリクエスト(つまり、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"
の形式で指定できます。1つ目の形式では、ドメインがローカル名を解決する手法(通常はDNS)を使用してhostname
のアドレスを検索します。hostname
にはローカル・マシン名を指定し、ローカル名解決の機能でhostname
をローカル・マシンのアドレスに明確に解決する必要があります。 2つ目の例の#.#.#.#
は、ドットで区切られた10進数です。ドット区切りの10進数形式では、それぞれの#
に0 - 255の数字を指定します。このドットで区切った10進数は、ローカル・マシンのIPアドレスを表現します。 上記のどちらの形式でも、port_number
はドメイン・プロセスがリクエストの受信をリスニングするTCPポート番号です。port_number
には、0から65535までの数字または名前を指定できます。port_number
が名前の場合は、ローカル・マシンのネットワーク・サービス・データベースになければなりません。 アドレスは、文字0xを先頭に付けて16進数形式でも指定できます。最初の0xの後の各文字は、0から9までの数値またはAからFまでの文字です(大文字と小文字は区別されません)。16進数の形式は、IPX/SPXやTCP/IPのような任意のバイナリ・ネットワーク・アドレスに使うことができます。 アドレスはまた、任意の文字列として指定することもできます。値は、構成ファイルの中の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環境でのエスケープ文字のカレット(^)を前に付ける必要があります。ただし、envfileでWSNADDR
が定義されている場合、Oracle Tuxedoシステムはtuxgetenv(3c)関数を介してWSNADDR
が定義する値を取得します。この場合、パイプ記号(|
)は特殊文字とみなされないので、カレット(^
)を使用する必要はありません。 Oracle Tuxedoシステムはかっこ付きアドレスを無作為に選択します。この方法は、一連のリスナー・プロセスに対してランダムに負荷分散します。接続が確立するまで順番にアドレス指定が試みられます。ワークステーション・リスナーを呼び出すには、アプリケーションの構成ファイルの値を使用してください。この値が、「0x」で始まる文字列の場合は、16進値文字列と解釈され、それ以外の場合は、ASCII文字列と解釈されます。
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
の場合は、デフォルトのアイデンティティとみなされます。デフォルトのアイデンティティは、現在のログイン・セッション、現在のオペレーティング・システム・アカウント、またはローカル・ハードウェア・デバイスなどの別の属性に基づいて決定されます。
呼出し側プロセスは、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
が発生します。例外は、ブロックされず、応答を期待せず、かつ呼出し側のトランザクションのために送信されないリクエスト(つまり、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
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
TPSUCCESS()
とともにTPRETURN()
が呼び出されています)。サービス・ルーチンの終了処理の一部として、サーバーはこの接続を切断しています。このため、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
が発生します。例外は、ブロックされず、応答を期待せず、かつ呼出し側のトランザクションのために送信されないリクエスト(つまり、TPNOTRAN
、TPNOBLOCK
、およびTPNOREPLY
が設定された状態でTPACALL()
が呼び出される場合)です。 ATMI呼出しがトランザクション内部で失敗すると、そのトランザクションは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()は何の影響も与えません。
引数のハンドリング中または処理中にエラーが検出されると、TPCALL()
またはTPGETRPLY()
でサービスの結果を受信するプログラムについては、TP-STATUS
に[TPESVCERR
]が設定され、TPSEND()
またはTPRECV()
を使用しているプログラムには会話を介してTPEV-SVCERR
イベントが送信されます。
TPCALL(3cbl)
、TPCONNECT(3cbl)
、TPFORWAR(3cbl)
TPRMCLOSE()
- 複数のRMサーバー・グループで構成された特定のRMをクローズするルーチン。
01 TPRMDEF-REC.
COPY TPRMDEF.
01 TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPRMCLOSE" USING TPRMDEF-REC TPSTATUS-REC.
TPCLOSERM()
は、引数rmidによって指定されたリソース・マネージャをクローズします。現在のコンテキストがトランザクション・コンテキスト内にある場合、このルーチンは何も行わず、呼出し側に戻ります。
TPCLOSERM()
は、TPOPENRM()ルーチンによってオープンされるリソース・マネージャのみをクローズできます。
TPRMCLOSE()
は正常終了時には、TP-STATUS
に[TPOK
]を設定します。
失敗時には、TPRMCLOSE()
は呼出し側プロセスのコンテキストを変更せず、TP-STATUSにエラー条件を示す値を設定します。
次の条件が発生すると、TPRMOPEN()
は失敗し、TP-STATUS
に次の値を設定します。
[TPERMERR]
[TPEPROTO]
TPRMCLOSE()
が不正なコンテキストで呼び出されました(たとえば、Oracle Tuxedoの複数のリソース・マネージャ・サーバー・グループに関連付けられていないクライアントによって呼び出されました。このクライアントは、複数のリソース・マネージャ・サーバー・グループ内にないサーバーによって呼び出されています。パラメータrmidによって指定されたリソース・マネージャがTPRMOPEN()
ルーチンを介してオープンされていないか、現在のプロセスがbuildserverの-M
オプションを使用して構築されていません)。
[TPEINVAL]
RMNAME
パラメータが、現在の複数のリソース・マネージャ・サーバー・グループで構成されている有効なリソース・マネージャ名ではありません)。
[TPESYSTEM]
[TPEOS]
TPOPEN(3cbl)
、TPCLOSE(3cbl)
、TPRMOPEN(3cbl)
TPRMEND()
- 特定のRM内のトランザクション・ブランチのかわりに実行された現在の処理を終了するルーチン。
01 TPRMDEF-REC.
COPY TPRMDEF.
01 TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPRMEND" USING TPRMDEF-REC TPSTATUS-REC.
TPRMEND()
は、特定のRM内のトランザクション・ブランチのかわりに実行された現在の処理を終了します。このルーチンは、このトランザクション・ブランチとの関連付けを解除するようリソース・マネージャに指示します。現在のRMがまだオープンされていないか、現在のコンテンツがトランザクション状態でない場合、TPRMEND()
は何もせず、TP-STATUS
をエラーに設定します。
正常終了時に、TPRMEND()
はTP-STATUS
を[TPOK]に設定します。
失敗時には、TPRMEND()
は呼出し側プロセスのコンテキストを変更せず、TP-STATUSにエラー条件を示す値を設定します。
次の条件が発生すると、TPRMEND()
は失敗し、TP-STATUS
に次の値を設定します。
[TPERMERR]
[TPEPROTO]
TPRMEND()
が不正なコンテキストで呼び出されました(たとえば、Oracle Tuxedoの複数のリソース・マネージャ・サーバー・グループを関連付けていないクライアントによって呼び出されました。このクライアントは、複数のリソース・マネージャ・サーバー・グループ内にないサーバーによって呼び出されています。パラメータrmidによって指定されたリソース・マネージャがTMRMOPEN()ルーチンを介してオープンされていないか、現在のプロセスがbuildserverの-Mオプションを使用して構築されていないか、現在のコンテキストがトランザクション・モードではありません)。
[TPEINVAL]
RMNAME
パラメータが、現在の複数のリソース・マネージャ・サーバー・グループで構成されている有効なリソース・マネージャの識別子ではありません)。
[TPEOS]
TPRMOPEN(3cbl)
、TPRMCLOSE(3cbl)
、TPRMSTART(3cbl)
TPRMOPEN()
- 複数のRMサーバー・グループで構成された特定のRMをオープンするルーチン。
01 TPRMDEF-REC.
COPY TPRMDEF.
01 TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPRMOPEN" USING TPRMDEF-REC TPSTATUS-REC.
TPRMOPEN()
は、複数のRMサーバー・グループで構成された特定のRMをオープンします。現在のコンテキストがトランザクション内にある場合、このルーチンは、トランザクション・ブランチのかわりにこのトランザクション処理単位にも参加するようオープンRMに指示します。現在のRMがすでにオープンされている場合、このルーチンは、オープン操作をスキップし、このルーチンがトランザクション・コンテキストで呼び出されたときにこのトランザクション処理単位に参加するようRMに指示しようとします。
TPRMOPEN()
は正常終了時には、TP-STATUS
に[TPOK
]を設定します。
失敗時には、TPRMOPEN()
は呼出し側プロセスのコンテキストを変更せず、TP-STATUS
にエラー条件を示す値を設定します。
次の条件が発生すると、TPRMOPEN()
は失敗し、TP-STATUS
に次の値を設定します。
[TPERMERR]
[TPEPROTO]
TPRMOPEN()
が不正なコンテキストで呼び出されました(たとえば、Oracle Tuxedoの複数のRMサーバー・グループに関連付けられていないクライアントによって呼び出されました。このクライアントは、複数のRMサーバー・グループ内にないサーバーによって呼び出されています。または、現在のプロセスがbuildserverの-Mオプションを使用して構築されていません)。
[TPEINVAL]
[TPESYSTEM]
[TPEOS]
TPOPEN(3cbl)
、TPCLOSE(3cbl)
、TPRMCLOSE(3cbl)
TPRMSTART()
- 複数のRMサーバー・グループ内の特定のRMのトランザクション・ブランチのかわりに処理を開始するルーチン。
01 TPRMDEF-REC.
COPY TPRMDEF.
01 TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPRMSTART" USING TPRMDEF-REC TPSTATUS-REC.
TPRMSTART()
は、トランザクション・ブランチのかわりに現在のトランザクション処理単位にも参加するようオープンRMに指示します。現在のRMがすでに開始状態にある場合、このルーチンは、操作をスキップします。現在のRMがまだオープンされていない場合、TPRMSTART()
>は何もせず、TP-STATUS
をエラー条件に設定します。
TPRMSTART()
は正常終了時には、TP-STATUS
に[TPOK
]を設定します。
失敗時には、TPRMSTART()
は呼出し側プロセスのコンテキストを変更せず、TP-STATUS
にエラー条件を示す値を設定します。
次の条件が発生すると、TPRMOPEN()
は失敗し、TP-STATUS
に次の値を設定します。
[TPERMERR]
[TPEPROTO]
-M
オプションを使用して構築されておらず、現在のRMがまだオープンされていません)。
[TPEINVAL]
[TPESYSTEM]
[TPEOS]
TPRMOPEN(3cbl)
、TPRMCLOSE(3cbl)
、TPRMEND(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
が発生します。例外は、ブロックされず、応答を期待せず、かつ呼出し側のトランザクションのために送信されないリクエスト(つまり、TPNOTRAN
、TPNOBLOCK
、およびTPNOREPLY
が設定された状態でTPACALL()
が呼び出される場合)です。 トランザクションATMI呼出しがトランザクション内部で失敗すると、そのトランザクションは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()
を呼び出したプロセスで、それが呼び出されていた場合です。
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では利用できません。ダイナミック・リンク・ライブラリと共有ライブラリの動作方法がこの環境では異なるためです。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
は、論理型フィルタ規則を含む文字列で、イベント・ブローカがイベントを通知する前に、有効であることが評価されなければなりません。ポストするイベントを受け取ると、EventBrokerはそのイベントのデータにフィルタ規則(存在する場合)を適用します。データがフィルタ・ルールのチェックにパスした場合、イベント・ブローカは通知メソッドを呼び出します。データがフィルタ・ルールを通過しない場合は、イベント・ブローカは対応する通知メソッドを呼び出しません。呼出し側は、異なるフィルタ・ルールを利用して同じイベントを何度でもサブスクライブすることができます。
フィルタ・ルールは、フィルタ・ルールの適用対象となる型付きレコードによって異なります。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 ATMIで使用できるあらゆるキュー・スペースおよびキューを指定でき、どちらもサブスクリプションの時点で存在していても存在していなくてもかまいません。
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
が発生します。例外は、ブロックされず、応答を期待せず、かつ呼出し側のトランザクションのために送信されないリクエスト(つまり、TPNOTRAN
、TPNOBLOCK
、およびTPNOREPLY
が設定された状態でTPACALL()
が呼び出される場合)です。 トランザクションATMI呼出しがトランザクション内部で失敗すると、そのトランザクションは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.
* User code
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
.
* User code
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(127).
01TPSTATUS-REC
.
COPY TPSTATUS.
CALL "TPUNADVERTISE" USINGSVC-NAME
TPSTATUS-REC
.
TPUNADVERTISE()
を使用すると、サーバーは、公開したサービスの公開解除を行うことができます。デフォルトの設定では、サーバーのサービスは、サーバーのブート時に公開され、サーバーの停止時にその公開が解除されます。
複数サーバー単一キュー(MSSQ)セットに属するすべてのサーバーは、同じサービス・セットを提供しなければなりません。これらのルーチンは、MSSQセットを共有する全サーバーを公開することによってこの規則を適用します。
TPUNADVERTISE()
は、該当サーバー(または、呼出し側のMSSQセットを共有するサーバー・セット)に対して宣言されたサービスとしてSVC-NAME
を削除します。SVC-NAME
にSPACES
を使用することはできません。また、SVC-NAME
は127文字以下で指定する必要があります。(「UBBCONFIG(5)」のSERVICES
の項を参照)。これ以上の長さの名前でも受け付けられますが、127文字に切り詰められます。このため、切り詰められた名前が他のサービス名と同じにならないよう、注意が必要です。
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
が発生します。例外は、ブロックされず、応答を期待せず、かつ呼出し側のトランザクションのために送信されないリクエスト(つまり、TPNOTRAN
、TPNOBLOCK
、およびTPNOREPLY
が設定された状態でTPACALL()
が呼び出される場合)です。 トランザクションATMI呼出しがトランザクション内部で失敗すると、そのトランザクションは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.
* Include TX definitions.
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.
* Include TX definitions.
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.
* Include TX definitions.
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.
* Include TX definitions.
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.
* Include TX definitions.
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.
* Include TX definitions.
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.
* Include TX definitions.
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.
* Include TX definitions.
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
メッセージを使用する場合には、アプリケーション・エラーをデバッグするのに有用なものだけを使用することをお薦めします。ログが情報であふれてしまうと、本来のエラーを検出するのが難しくなります。
![]() ![]() ![]() |