BEA Logo BEA Tuxedo Release 8.0

  BEA ホーム  |  イベント  |  ソリューション  |  パートナ  |  製品  |  サービス  |  ダウンロード  |  ディベロッパ・センタ  |  WebSUPPORT

 

   Tuxedoホーム   |   BEA Tuxedo C リファレンス   |   先頭へ   |   前へ   |   次へ   |   目次

 


tpsubscribe(3c)

名前

tpsubscribe()-イベントをサブスクライブする

形式

#include <atmi.h> 
long tpsubscribe(char *eventexpr, char *filter, TPEVCTL *ctl, long
flags)

機能説明

呼び出し元は tpsubscribe() を使用して、eventexpr で示されるイベントまたはイベントの集合をサブスクライブします。サブスクリプションは、BEA Tuxedo ATMI イベント・ブローカ、TMUSREVT(5) によって保持され、イベントがポストされたときにサブスクライバに通知するために、tppost() によって使用されます。それぞれのサブスクリプションには、通知メソッドを指定します。通知メソッドは、クライアント通知、サービス呼び出し、または安定記憶域内のキューへのメッセージ登録の 3 つの内いずれかの形式をとります。通知メソッドはサブスクライバのプロセスのタイプと tpsubscribe() に渡された引数によって決まります。

サブスクライブするイベントまたはイベントの集合は、eventexpr で指定します。eventexpr には、最大で 255 文字の正規表現が入った NULL で終了する文字列を指定します。たとえば、eventexpr が "\e\e..*" であれば、呼び出し元はシステムで生成されたすべてのイベントをサブスクライブします。eventexpr が "\e\e.SysServer.*" であれば、呼び出し元はシステムで生成されたサーバに関連するすべてのイベントをサブスクライブします。eventexpr が "[A-Z].*" であれば、呼び出し元は先頭に A-Z を持つすべてのユーザ・イベント文字列をサブスクライブします。eventexpr が ".*(ERR|err).*" である場合、呼び出し側はサブストリング "ERR" または "err" のいずれかを含むすべてのユーザ・イベントを登録しています。たとえば、account_error および ERROR_STATE と呼ばれるイベントは、どちらも登録の対象となります。正規表現の詳細については、「正規表現」を参照してください。

filter を指定する場合は、ブール値のフィルタ・ルールを含む文字列を指定します。このルールは、イベント・ブローカがイベントをポストする前に正しく評価しなければなりません。ポストすべきイベントを受け取ったイベント・ブローカは、ポストするイベントのデータにフィルタ・ルール (存在する場合) を適用します。データがフィルタ・ルールのチェックにパスした場合、イベント・ブローカは通知方式を呼び出します。データがフィルタ・ルールを通過しない場合は、イベント・ブローカは対応する通知メソッドを呼び出しません。呼び出し元は別のフィルタ・ルールを使用して、同じイベントを何回もサブスクライブすることができます。

フィルタ・ルールは、それが適用される型付きバッファに固有なものです。FML バッファおよび VIEW バッファの場合は、フィルタ・ルールはそれぞれのブール式コンパイラ (それぞれ Fboolco(3fml) および Fvboolco(3fml) を参照) に渡すことができて、ポストされたバッファ (Fboolev(3fml) および Fboolev(3fml) を参照) に対して評価することができる文字列です。STRING バッファの場合は、フィルタ・ルールは正規表現です。他のすべてのタイプのバッファの場合、カスタマイズしたフィルタ評価機構が必要です (カスタマイズしたフィルタ評価機構を追加する方法について詳しくは、buffer(3c) および typesw(5) を参照してください)。filter には、最大 255 文字の NULL で終了する文字列を指定します。

サブスクライバが BEA Tuxedo ATMI のクライアント・プロセスで、ctl が NULL の場合は、サブスクライブしているイベントがポストされたときに、イベント・ブローカはサブスクライバに任意通知型メッセージを送ります。この場合、eventexpr に対して評価が成功するイベント名がポストされると、イベント・ブローカは eventexpr に対応したフィルタ・ルールに対してポストされたデータをテストします。データがフィルタ・ルールを通過した場合、またはイベントに対するフィルタ・ルールが存在しない場合は、サブスクライバはイベントと共にポストされたすべてのデータと共に任意通知型の通知を受け取ります。任意通知型メッセージを受け取るためには、クライアントは任意通知処理ルーチンを (tpsetunsol() を利用して) 登録しておく必要があります。BEA Tuxedo システムのサーバ・プロセスが、ctl パラメータを NULL にして tpsubscribe() を呼び出した場合は、tpsubscribe() は異常終了して tperrno()TPEPROTO に設定します。

任意通知型メッセージによってイベント通知を受け取るクライアントは、終了する前にイベント・ブローカのアクティブなサブスクリプションのリストから、そのサブスクリプションを削除するべきです (詳しくは tpunsubscribe(3c) を参照してください)。クライアントで tpunsubscribe() のワイルド・カード・ハンドル -1 を使用すれば、任意通知型の通知メソッドに対応したサブスクリプションを含む、そのクライアントのすべての「非持続型」サブスクリプションを削除することが簡単に行えます (プロセスの終了後も持続するサブスクリプションおよびこれらに関連した通知メソッドについては、次の TPEVPERSIST に関する説明を参照してください)。クライアントが非持続型のサブスクリプションを削除せずに終了した場合は、イベント・ブローカはそのクライアントにアクセス不可能になっていることを検知した時点でそれらのサブスクリプションを削除します。

サブスクライバが (プロセス・タイプにかかわらず) イベント通知をサービス・ルーチンまたは安定記憶域内のキューに送りたい場合は、ctl パラメータは有効な TPEVCTL 構造体を指さなければいけません。この構造体には次のエレメントが含まれます。

long    flags;  
char name1[32];
char name2[32];
TPQCTL qctl;

次に、ctl->flags 要素に指定する、イベントをサブスクライブするための制御オプションの有効なビットの一覧を示します。

TPEVSERVICE

このフラグは、サブスクライバがイベント通知を ctl->name1 という名前の BEA Tuxedo ATMI システムのサービス・ルーチンに送りたいことを示します。この場合、eventexpr に対して評価が成功するイベント名がポストされると、イベント・ブローカは eventexpr に対応したフィルタ・ルールに対してポストされたデータをテストします。データがフィルタ・ルールを通過する場合、またはイベントに対するフィルタ・ルールが存在しない場合は、サービス要求はイベントと共にポストされたデータと合わせて ctl->name1 に送られます。ctl->name1 のサービス名には、BEA Tuxedo ATMI システムの有効な任意のサービス名を指定することができ、このサービスはサブスクライブされたときにアクティブである場合もあれば、アクティブでない場合もあります。イベント・ブローカによって呼び出されたサービス・ルーチンは、応答データとともに戻ることはできません。つまり、引数に NULL データを指定して tpreturn() を呼び出すはずです。tpreturn() に渡されるデータはドロップされます。TPEVSERVICETPEVQUEUE を同時に指定することはできません。

TPEVTRAN も同時に ctl->flags に設定し、また tppost() を呼び出すプロセスがトランザクション・モードにある場合は、イベント・ブローカはサービス・ルーチンがポスト元のトランザクションの一部となるようにサブスクライブされたサービス・ルーチンを呼び出します。イベント・ブローカ (TMUSREVT(5)) とサブスクライブされたサービス・ルーチンの両方が、トランザクションをサポートするサーバ・グループに属していなければなりません (詳しくは UBBCONFIG(5) を参照してください)。ctl->flagsTPEVTRAN を設定していない場合は、イベント・ブローカは、サービス・ルーチンがポスト元のトランザクションの一部とならないように、サブスクライブされたサービス・ルーチンを呼び出します。

TPEVQUEUE

このフラグを設定することは、サブスクライバがイベント通知を ctl->name1 という名前のキュー・スペース、および ctl->name2 という名前のキューへ登録することを希望していることを示します。この場合、eventexpr に対して評価が成功するイベント名がポストされると、イベント・ブローカは eventexpr に対応したフィルタ・ルールに対してポストされたデータをテストします。データがフィルタ・ルールを通過した場合、またはイベントに対応したフィルタ・ルールが存在しない場合は、イベント・ブローカはメッセージをイベントと共にポストされたデータと合わせて、ctl->name1 という名前のキュー・スペース、および ctl->name2 という名前のキューに登録します。キュー・スペースおよびキューの名前は、BEA Tuxedo ATMI システムの有効な任意のキュー・スペースおよびキューの名前で、サブスクリプションの実行時に存在している場合と存在していない場合があります。

ctl->qctl には、ポストされたイベントをイベント・ブローカがキューに登録することに関するオプションをさらに指定することができます。オプションを何も指定しない場合は、ctl->qctl.flags には TPNOFLAGS を設定してください。設定する場合は、tpenqueue(3c) のマニュアル・ページの「制御パラメータ」サブセクションで説明しているようにオプションを設定できます (特に、tpenqueue(3c) への入力情報を制御するフラグの有効なリストを説明しているセクションを参照してください)。TPEVSERVICETPEVQUEUE を同時に指定することはできません。

ctl->flagsTPEVTRAN も同時に指定し、tppost() を呼び出すプロセスがトランザクション・モードにある場合は、イベント・ブローカは、ポストされたイベントとそのデータがポスト元のトランザクションの一部となるように、それらをキューに登録します。イベント・ブローカ (TMUSREVT(5)) はトランザクションをサポートするサーバ・グループに属していなければなりません (詳しくは、UBBCONFIG(5) を参照してください)。ctl->flagsTPEVTRAN を設定しない場合は、イベント・ブローカは、ポストされたイベントとそのデータがポスト元のトランザクションの一部とならないように、それらをキューに登録します。

TPEVTRAN

このフラグを設定することは、このサブスクリプションのイベント通知が存在する場合に、サブスクライバがこれをポスト元のトランザクションに含めることを希望していることを示します。ポスト元がトランザクション以外の場合、このイベントを通知するためにトランザクションが開始されます。このフラグを設定しない場合は、このサブスクリプションに対してポストされたいかなるイベントも、ポスト元が参加しているどのトランザクションの代わりに実行させることはできません。このフラグは、TPEVSERVICE または TPEVQUEUE のどちらかと同時に指定できます。

TPEVPERSIST

デフォルトで、BEA Tuxedo のイベント・ブローカは、ポストしようとしている資源が利用できない場合 (たとえば、イベント・ブローカがサービス・ルーチンまたはイベントのサブスクリプションに対応したキュー・スペースやキューの名前、もしくはそれらの両方にアクセスできない場合)、サブスクリプションを削除します。このフラグを設定することは、そのようなエラーが発生してもサブスクリプションが持続するように (多くの場合、資源は後で利用できるようになるため) サブスクライバが求めることを示します。このフラグを設定しない場合、このサブスクリプションで指定されたサービス名またはキュー・スペース名/キュー名のいずれかへのアクセス時にエラーが発生すると、イベント・ブローカはこのサブスクリプションを削除します。

このフラグを TPEVTRAN と同時に指定し、イベントの通知時に資源が利用できない場合は、イベント・ブローカはポスト元に戻り、トランザクションが中止しなければならないようにします。つまりこれは、サブスクリプションがそのままの状態で残ったとしても、リソースを利用できないことがポスト元のトランザクションの異常終了の原因になるということです。

イベント・ブローカのアクティブなサブスクリプションのリストに、tpsubscribe() が要求するサブスクリプションと一致するものがある場合は、この関数は異常終了して tperrno()TPEMATCH を設定します。サブスクリプションが既存のサブスクリプションと一致するためには、eventexprfilter の両方が、イベント・ブローカのアクティブなサブスクリプションのリストにすでに存在するサブスクリプションの eventexprfilter に一致しなければなりません。さらに、通知メソッドによって異なりますが、一致を調べるために他の基準も使用されます。

サブスクライバがBEA Tuxedo ATMI システムのクライアント・プロセスで、(イベントがポストされたときに、呼び出し元が任意通知を受け取るように) ctl に NULL を設定した場合は、システム定義によるそのクライアント識別子 (CLIENTID と呼ばれています) も一致を調べるために使用されます。つまり tpsubscribe() は、eventexprfilter、および呼び出し元の CLIENTID が、イベント・ブローカにすでに知られているサブスクリプションが持つそれらの値と一致する場合に異常終了します。

呼び出し元が ctl->flagsTPEVSERVICE を設定した場合は、eventexprfilter、および ctl->name1 に設定されたサービス名が、イベント・ブローカにすでに知られているサブスクリプションが持つそれらの値と一致する場合に tpsubscribe() は異常終了します。

安定記憶域内のキュー、キュー・スペース、およびキューの名前へのサブスクリプションの場合は、一致を調べる際に eventexpr および filter に加えて相関識別子が使用されます。相関識別子は、同じイベント表現とフィルタ・ルールを持ち、同じキューに向けられている複数のサブスクリプションを区別するために使用できます。したがって、呼び出し元が ctl->flagsTPEVQUEUE を設定し、ctl->qctl.flagsTPQCOORID が設定されなかった場合、eventexprfilterctl->name1 に設定されたキュー・スペース名、および ctl->name2 に設定されたキュー名が、イベント・ブローカにすでに知られている (相関識別子が指定された) サブスクリプションが持つそれらの値と一致すると tpsubscribe() は異常終了します。さらに、ctl->qctl.flagsTPQCOORID が設定されている場合は、eventexprfilterctl->name1ctl->name2、および ctl->qctl.corrid がイベント・ブローカに既に知られている (同じ相関識別子が指定された) サブスクリプションのデータと一致すると、tpsubscribe() は異常終了します。

次に tpsubscribe() に指定できる有効な flags の一覧を示します。

TPNOBLOCK

ブロッキング条件が存在する場合は、サブスクリプションは行われません。このような条件が発生すると、呼び出しは異常終了し、tperrno()TPEBLOCK が設定されます。TPNOBLOCK が指定されていないときにブロッキング条件が存在すると、呼び出し元は、その条件が解消されるか、またはタイムアウト (トランザクションまたはブロッキング) が発生するまではブロックされます。

TPNOTIME

このフラグは、呼び出し元が無制限にブロックでき、ブロッキング・タイムアウトの対象にならないようにすることを指定します。ただし、トランザクションのタイムアウトは発生します。

TPSIGRSTRT

シグナルが関数内部のシステム・コールを中断すると、中断されたシステム・コールは出しなおされます。TPSIGRSTRT が指定されていない場合にシグナルがシステム・コールを中断させると、tpsubscribe() は異常終了し、tperrno() には TPGOTSIG が設定されます。

マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは、tpsubscribe() の呼び出しを発行できません。

正規表現

表 12 で説明する正規表現は、UNIX システム・エディタ、ed(1) で使用されるパターンに似ています。一般的な正規表現のほか、代替演算子 (|) も使用できます。 ただし、全体的にはほとんど変わりません。

正規表現 (RE: Regular Expression) は、次に示すいずれかの規則を 1 回以上適用して作成します。

正規表現

規則

一致対象のテキスト

任意の文字

任意の文字 (以下に示す特殊文字を除く任意の ASCII 文字)。

\ 任意の文字

以下に示す以外の任意の文字。

\ 特殊文字

非特殊文字。特殊文字には、ピリオド (.)、*+?|()[{\\、があります。

.-行末文字 (通常は改行文字または NULL 文字) 以外の任意の文字

^-行頭

$-行末文字

[class]

一連の文字または範囲、あるいはその両方で表すクラス内の任意の文字。範囲は、「character-character」という形式で指定されます。たとえば、文字クラス [a-zA-Z0-9_] は、アルファベット文字またはアンダーライン"_" と一致します。ハイフンをクラスに含めるには、"\\" の後のハイフンをエスケープするか、クラス内の先頭または終わりに指定する必要があります。リテラル "]" の場合は、エスケープするか、またはクラスの先頭に指定します。リテラル "^" がクラスの先頭にある場合は、エスケープする必要があります。

[^ class ]

行末文字を除く、クラスの補集合における ASCII 文字セットに関する文字。

RE RE

正規表現のシーケンス (連結)。

RE | RE

左側の RE または右側の RE (左右の二者択一)。

RE *

RE が 0 回以上発生。

RE +

RE が 1 回以上発生。

RE ?

RE が 0 回または 1 回発生。

RE { n }

RE n 回発生。n の範囲は 0〜255 です。

RE { m, n }

RE mn の範囲の回数発生。m が指定されない場合は 0 になります。n が指定されない場合は、RE が m 回以上発生することを示します。

( RE )

優先順位またはグループ化を明示的に示します。

( RE ) $ n

テキスト・マッチングの RE は、n 番目のユーザ・バッファにコピーされます。n の範囲は、0〜9 です。 ユーザ・バッファは、マッチング処理の開始までにクリアされ、パターン全体がマッチした場合にのみロードされます。


 

優先順位のレベルは 3 つあります。結合の強さの順に並べると、次のようになります。

上記のとおり、かっこは、優先順位が高いことを明示的に示すために使用します。

戻り値

tpsubscribe() は正常終了すると、イベント・ブローカのアクティブなサブスクリプションのリストからこのサブスクリプションを削除するために使用できるハンドルを返します。サブスクライバやその他のプロセスは、いずれも返されたハンドルを利用してこのサブスクリプションを削除することができます。

異常終了すると、tpsubscribe() は -1 を返し、tperrno() を設定してエラー条件を示します。

エラー

異常終了時には、tpsubscribe()tperrno() を次のいずれかの値に設定します(特に指定がない限り、障害は、呼び出し元のトランザクションに影響しません)。

[TPEINVAL]

無効な引数 (たとえば、eventexpr に NULL) が指定されました。

[TPENOENT]

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

[TPELIMIT]

イベント・ブローカが最大サブスクリプション数に達したため、サブスクライブできません。

[TPEMATCH]

すでにイベント・ブローカのリストに存在するサブスクリプションと同じであるため、サブスクライブできません。

[TPEPERM]

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

[TPETIME]

タイムアウトが発生しました。呼び出し元がトランザクション・モードの場合は、トランザクション・タイムアウトが発生し、そのトランザクションは終了します。トランザクション・モードでなければ、ブロッキング・タイムアウトが発生し、TPNOBLOCKTPNOTIME も指定されていませんでした。トランザクション・タイムアウトが発生した場合、新しく処理を開始しようとしても、トランザクションがアボートするまで TPETIME になり、正常に行えません。

[TPEBLOCK]

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

[TPGOTSIG]

シグナルを受け取りましたが、TPSIGRSTRT が指定されていません。

[TPEPROTO]

tpsubscribe() が不正に呼び出されました。

[TPESYSTEM]

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

[TPEOS]

オペレーティング・システムのエラーが発生しました。

関連項目

buffer(3c)tpenqueue(3c)tppost(3c)tpsetunsol(3c)tpunsubscribe(3c)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)

 

先頭へ戻る 前のトピックへ 次のトピックへ