bea ホーム | 製品 | dev2dev | support | askBEA
BEA Logo Tuxedo
 ドキュメントのダウンロード   サイトマップ   用語集 
検索
0

Tuxedo COBOL リファレンス

 Previous Next Contents View as PDF  

TPSUBSCRIBE(3cbl)

名前

TPSUBSCRIBE()−イベントのサブスクライブ

形式

01 TPEVTDEF-REC.
COPY TPEVTDEF.

01
TPQUEDEF-REC.
COPY TPQUEDEF.

01
TPSTATUS-REC.
COPY TPSTATUS.

CALL "TPSUBSCRIBE" USING
TPEVTDEF-REC TPQUEDEF-REC TPSTATUS-REC.

機能説明

呼び出し元は、TPEVTDEF-RECEVENT-EXPR で指定されたイベントまたはイベント・セットをサブスクライブする際に TPSUBSCRIBE() を使用します。サブスクリプションは BEA Tuxedo のイベント・ブローカ、TMUSREVT() によって管理され、イベントが TPPOST() を介して通知されるときサブスクライバに知らせるために使用されます。それぞれのサブスクリプションには、通知メソッドを指定します。通知メソッドは、クライアント通知、サービス呼び出し、または安定記憶域内のキューへのメッセージ登録の 3 つの内いずれかの形式をとります。通知方法は、サブスクライバのプロセス・タイプおよび TPEVTDEF-RECTPEV-METHOD-FLAG によって決定されます。

サブスクライブするイベントまたはイベント・セットの名前は、正規表現、すなわち TPEVTDEF-RECEVENT-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-RECEVENT-FILTER は、論理型フィルタ規則を含む文字列で、イベント・ブローカがイベントを通知する前に、有効であることが評価されなければなりません。ポストするイベントを受け取ると、イベント・ブローカはそのイベントのデータにフィルタ規則 (存在する場合) を適用します。データがフィルタ・ルールのチェックにパスした場合、イベント・ブローカは通知メソッドを呼び出します。データがフィルタ・ルールを通過しない場合は、イベント・ブローカは対応する通知メソッドを呼び出しません。呼び出し元は、異なるフィルタ・ルールを利用して同じイベントを何度でもサブスクライブすることができます。

フィルタ・ルールは、フィルタ・ルールの適用対象となる型付きレコードによって異なります。FML レコードや VIEW レコードの場合、フィルタ規則は文字列であり、それぞれの論理式コンパイラに渡すことができ (Fboolco、Fboolco32、Fvboolco、Fvboolco32(3fml) を参照)、通知されるレコードに対して評価されます (Fboolev、Fboolev32、Fvboolev、Fvboolev32(3fml) を参照)。STRING レコードの場合、フィルタ規則は tpsubscribe(3c) で指定される形式の正規表現です。その他のタイプのレコードについては、それぞれカスタマイズされた独自のフィルタ評価機構が必要になります (カスタマイズされたフィルタ評価機構の追加に関しては、buffer(3c) および typesw(5) を参照)。EVENT-EXPR に該当するフィルタ・ルールが存在しない場合は、 EVENT-FILTERSPACES にセットする必要があります。

サブスクライバが BEA Tuxedo ATMI のクライアント・プロセスであり、TPEVTDEF-RECTPEVNOTIFY が設定されている場合、サブスクライブしたイベントが通知されると、イベント・ブローカはサブスクライバに任意通知型メッセージを送出します。つまり、EVENT-EXPR に対して有効であると評価されるイベント名が通知されると、イベント・ブローカは、EVENT-EXPR に関連するフィルタ規則を使用して、通知されるデータをチェックします。データがフィルタ・ルールによるチェックにパスした場合、あるいはそのイベントに対して適用すべきフィルタ・ルールが存在しない場合は、サブスクライバはイベントとそのデータ、および任意通知型メッセージを受け取ることになります。任意通知型メッセージを受け取るためには、クライアントは任意通知処理ルーチンを (TPSETUNSOL() を利用して) 登録しておく必要があります。BEA Tuxedo ATMI のサーバ・プロセスが TPEVNOTIFY を設定して TPSUBSCRIBE() を呼び出すと、TPSUBSCRIBE() は異常終了し、TPSTATUS-RECTP-STATUS に [TPEPROTO] が設定されます。

任意通知型メッセージを介してイベント通知を受け取るクライアントは、終了する前に、イベント・ブローカのアクティブなサブスクリプションのリストから、それぞれのサブスクリプションを削除する必要があります (詳細は TPUNSUBSCRIBE() を参照)。クライアントは、TPUNSUBSCRIB() のワイルドカード・ハンドル、-1 を使用することにより、任意通知メソッドに関連するサブスクリプションを含むあらゆる「非永続的」サブスクリプションを削除することができます。プロセス終了後も存続するサブスクリプションおよびそれらに関連する通知メソッドについては、以下の TPEVPERSIST の説明を参照してください。クライアントが非持続型のサブスクリプションを削除せずに終了した場合は、イベント・ブローカはクライアントにアクセスできなくなったことを検出すると、そのクライアントのサブスクリプションを削除します。

TPEVNOTIFY が設定される場合は、TPEVNOTRANTPEVNOPERSIST も設定される必要があります。そうでない場合、TPSUBSCRIBE() は異常終了し、TP-STATUS に [TPEINVAL] が設定されます。このことは、任意通知型の通知メソッドを持つクライアントによるサブスクリプションは、トランザクショナルでも、持続型でもあり得ないことを意味します。

サブスクライバ (プロセスのタイプとは無関係) が TPEVTDEF-RECTPEVSERVICE() を設定すると、イベント通知は TPEVTDEF-RECNAME-1 で指定された BEA Tuxedo ATMI のサービス・ルーチンに送信されます。つまり、EVENT-EXPR に対して有効であると評価されるイベント名が通知されると、イベント・ブローカは、EVENT-EXPR に関連するフィルタ規則を使用して、通知されるデータをチェックします。データがフィルタ・ルールによるチェックにパスした場合、あるいはそのイベントに適用すべきフィルタ・ルールが存在しない場合は、サービス要求はそのイベントに付随するデータとともに NAME-1 に渡されます。NAME-1 には BEA Tuxedo ATMI の有効なあらゆるサービス名をセットすることができ、また、サブスクリプションが行われた時点でアクティブであってもアクティブでなくてもかまいません。イベント・ブローカによって呼び出されたサービス・ルーチンは、応答データなしで戻ります。すなわち、これらのサービス・ルーチンは、TPRETURN() を呼び出す際には TPTYPE-RECREC-TYPE を SPACES にセットする必要があります。TPRETURN() に渡されるデータは、すべて切り捨てられます。

TPEVTDEF-RECTPEVTRAN も設定され、TPPOST() を呼び出すプロセスがトランザクション・モードの場合、イベント・ブローカは、サブスクライブされるサービス・ルーチンをポスト元のトランザクションの一部として呼び出します。イベント・ブローカ TMUSREVT() とサブスクライブされるサービス・ルーチンは両方とも、トランザクションをサポートするサーバ・グループに属している必要があります (詳細は UBBCONFIG(5) を参照)。TPEVNOTRAN が設定されている場合、イベント・ブローカは、サブスクライブされるサービス・ルーチンをポスト元のトランザクションとは別に呼び出します。

サブスクライバ (プロセスのタイプは無関係) が TPEVTDEF-RECTPEVQUEUE() を設定すると、イベント通知は TPEVTDEF-RECNAME-1 で指定されたキュー・スペースの、TPEVTDEF-RECNAME-2 で指定されたキューに登録されます。つまり、EVENT-EXPR に対して有効であると評価されるイベント名が通知されると、イベント・ブローカは、EVENT-EXPR に関連するフィルタ規則を使用して、通知されるデータをチェックします。データがフィルタ規則によるチェックにパスした場合、あるいはそのイベントに適用すべきフィルタ規則が存在しない場合、イベント・ブローカは、イベントとともに通知されるあらゆるデータとメッセージを、NAME-1 で指定されたキュー・スペースの NAME-2 で指定されたキューに登録します。キュー・スペースとキューは、BEA Tuxedo システムで使用できるあらゆるキュー・スペースおよびキューを指定でき、どちらもサブスクリプションの時点で存在していても存在していなくてもかまいません。

TPQUEDEF-REC には、通知されるイベントをイベント・ブローカがキューに登録する際の手順をさらに詳しく指示するためのオプションを含めることができます。呼び出し元で指定すべきオプションがない場合は、TPQUEDEF-REC LOW-VALUE にセットします。一方、指定すべきオプションがある場合は、TPENQUEUE() の項の「制御パラメータ」のセクションで説明した方法でオプションを指定します (特に TPENQUEUE() の入力データ制御の有効なフラグ設定について説明した箇所を参照のこと)。

TPEVTDEF-RECTPEVTRAN も設定され、TPPOST() を呼び出すプロセスがトランザクション・モードの場合、イベント・ブローカは、通知されるイベントとそのデータをポスト元のトランザクションの一部としてキューに登録します。イベント・ブローカ TMUSREVT() は、トランザクションをサポートするサーバ・グループに属している必要があります (詳細は UBBCONFIG(5) を参照)。TPEVNOTRAN が設定されている場合、イベント・ブローカは、通知されるイベントとそのデータをポスト元のトランザクションとは別にキューに登録します。

デフォルトでは、BEA Tuxedo のイベント・ブローカは、通知先のリソースが使用不可能である場合はサブスクリプションを削除します。たとえば、イベントのサブスクリプションに関連するサービス・ルーチン、またはキュー・スペースとキューにイベント・ブローカがアクセスできない場合などです。TPEVTDEF-RECTPEVPERSIST は、サブスクライバがこのようなエラーに遭遇したあとも (将来リソースが再度使用可能になった場合に備えて) 引き続きサブスクリプションを維持したい場合にセットします。永続的なサブスクリプションは、TPEVSERVICE() および TPEVQUEUE() の通知メソッドでしか利用できません。TPEVNOTIFY が設定されるときに TPEVPERSIST を使用することはできません。使用した場合、関数は異常終了し、TP-STATUS に [TPEINVAL] が設定されます。TPEVNOPERSIST を設定した場合、サブスクリプションで指定されたクライアント、サービス名、またはキュー・スペースとキュー名にアクセスする際にエラーが発生すると、イベント・ブローカはこのサブスクリプションを削除します。

TPEVPERSISTTPEVTRAN がともに設定されて、イベント通知時にリソースが使用できなかった場合、イベント・ブローカはポスト元に戻り、トランザクションがアボートされるようにします。すなわち、サブスクリプションが保持されている場合でも、リソースが使用できなければポスト元のトランザクションは異常終了します。

TPSUBSCRIBE() で要求されるサブスクリプションと一致するものがイベント・ブローカのアクティブなサブスクリプションのリストに既に存在する場合、関数は異常終了し、TP-STATUS に [TPEMATCH] が設定されます。サブスクリプションが既存のサブスクリプションと一致すると判断されるには、EVENT-EXPREVENT-FILTER の両方が、イベント・ブローカのアクティブなサブスクリプションのリストに既に存在するサブスクリプションのものと一致することが条件です。また、通知メソッドによっては、サブスクリプションの一致を判断する際にこれ以外の基準も使用されます。

TPEVNOTIFY がセットされていると、呼び出し元の CLIENTID (システムが定義したクライアント識別子) もサブスクリプションの一致を検出する際の判断材料に加えられます。つまり、EVENT-EXPREVENT-FILTER、および呼び出し元の CLIENTID がイベント・ブローカのリストに既に存在するサブスクリプションのデータと一致する場合、TPSUBSCRIBE() は異常終了します。

TPEVSERVICE() が設定されている場合は、EVENT-EXPREVENT-FILTER、および NAME-1 で指定されるサービス名がイベント・ブローカのリストに既に存在するサブスクリプションのそれと一致すると、TPSUBSCRIBE() は異常終了します。

TPEVQUEUE() が設定されている場合は、イベント・ブローカはサブスクリプションの一致を判断する際に、EVENT-EXPR EVENT-FILTER のほか、キュー・スペース、キュー名、および相関識別子を使用します。相関識別子を利用することにより、同じ送信先の、同じイベント式やフィルタ・ルールに対する複数のサブスクリプションを区別することができます。したがって、呼び出し元が TPEVQUEUE()TPQNOCOORID() の両方を設定した場合は、EVENT-EXPREVENT-FILTERNAME-1 で指定されるキュー・スペースの名前、および NAME-2 で指定されるキューの名前が、イベント・ブローカのリストに既に存在するサブスクリプション (相関識別子は指定されていない) のデータと一致すると、TPSUBSCRIBE() は異常終了します。さらに、TPQCOORID() が設定されている場合、EVENT-EXPREVENT-FILTERNAME-1 NAME-2、および TPQUEDEF-RECCORRID がイベント・ブローカのリストに既に存在するサブスクリプション (同じ相関識別子を持つ) のデータと一致すると、TPSUBSCRIBE() は異常終了します。

次に、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 のいずれかが設定されていなければなりません。

戻り値

TPSUBSCRIBE() は正常終了時には、TP-STATUS に [TPOK] を設定します。また、TPSUBSCRIBE() は、TPEVTDEF-RECSUBSCRIPTION-HANDLE にこのサブスクリプションのハンドルを設定します。SUBSCRIPTION-HANDLE は、イベント・ブローカのアクティブなサブスクリプションのリストからこのサブスクリプションを削除するために TPUNSUBSCRIBE() を呼び出す際に利用できます。サブスクライバやその他のプロセスは、いずれも返されたハンドルを利用してこのサブスクリプションを削除することができます。

エラー

次の条件が発生すると、TPSUBSCRIBE() は異常終了し、TP-STATUS に次のいずれかの値を設定します (特に記述した場合を除いては、エラーが呼び出し元のトランザクションに影響を及ぼすことはありません)。

[TPEINVAL]

無効な引数が渡されました (EVENT-EXPRSPACES である場合など)。

[TPENOENT]

BEA Tuxedo イベント・ブローカにアクセスできません。

[TPELIMIT]

イベント・ブローカの最大サブスクリプション数に達したため、サブスクリプションが異常終了しました。

[TPEMATCH]

イベント・ブローカのリストに既に存在するサブスクリプションと一致するため、サブスクリプションが異常終了しました。

[TPEPERM]

クライアントは tpsysadm としてアタッチされず、サブスクリプションのアクションは、サービスの呼び出しか、メッセージのキューへの登録になります。

[TPETIME]

このエラー・コードは、タイムアウトが発生したか、または現在のトランザクションがすでに「ロールバックのみ」とマークされているにもかかわらず TPSUBSCRIBE() が試行されたことを示します。

呼び出し元がトランザクション・モードにある場合、トランザクションはすでに「ロールバックのみ」になっているか、またはタイムアウトが発生しています (中途終了マークが付けられる)。呼び出し元がトランザクション・モードにない場合、ブロッキング・タイムアウトが発生しています。ブロッキング・タイムアウトは、TPBLOCKTPTIME の両方が指定された場合にのみ発生します。

トランザクション・タイムアウトが発生すると、1 つの例外を除き、トランザクションがアボートされない限り、新しいリクエストを送信したり、未処理の応答を受信しようとしても、TPETIME で異常終了します。例外は、ブロックされず、応答を期待せず、かつ呼び出し元のトランザクションのために送信されない要求 (つまり、TPNOTRANTPNOBLOCK および TPNOREPLY が設定された状態で TPACALL() が呼び出される場合) です。

トランザクション ATMI 呼び出しがトランザクション内部で失敗すると、そのトランザクションは TX_ROLLBACK_ONLY 状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME で異常終了します (前の段落で説明した例外を除く)。

[TPEBLOCK]

ブロッキング状態のため、TPNOBLOCK が指定されました。

[TPGOTSIG]

シグナルが受信され、TPNOSIGRSTRT がセットされていました。

[TPEPROTO]

TPSUBSCRIBE() が不正なコンテキストで呼ばれました。

[TPESYSTEM]

BEA Tuxedo システムのエラーが発生しました。エラーの正確な内容がログ・ファイルに書き込まれます。

[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)

 

Back to Top Previous Next
Contact e-docsContact BEAwebmasterprivacy