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

Tuxedo C リファレンス

 Previous Next Contents View as PDF  

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 ATMI システムのサーバ・プロセスが、ctl パラメータを NULL にして tpsubscribe() を呼び出した場合は、tpsubscribe() は異常終了して tperrnoTPEPROTO に設定します。

任意通知型メッセージによってイベント通知を受け取るクライアントは、終了する前にイベント・ブローカのアクティブなサブスクリプションのリストから、そのサブスクリプションを削除するべきです (詳細については、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() が要求するサブスクリプションと一致するものがある場合は、この関数は異常終了して tperrnoTPEMATCH を設定します。サブスクリプションが既存のサブスクリプションと一致するためには、eventexprfilter の両方が、イベント・ブローカのアクティブなサブスクリプションのリストにすでに存在するサブスクリプションの eventexpr と filter に一致しなければなりません。さらに、通知メソッドによって異なりますが、一致を調べるために他の基準も使用されます。

サブスクライバが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 Expressions) は、次に示すいずれかの規則を 1 回以上適用して作成します。

表 12 正規表現

規則

一致対象のテキスト

任意の文字

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

¥ 任意の文字

次に示す以外の任意の文字

¥ 特殊文字

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

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

^−行頭

$−行末文字

[class]

一連の文字または範囲、あるいはその両方で表すクラス内の任意の文字。範囲は、「character-character」という形式で指定されます。たとえば、文字クラス [a-zA-Z0-9_] は、英数字またはアンダーライン &dlq;drq; と一致します。ハイフ“に含めるためには、&dlq;¥¥&drq; の後のハイフン (“q”スケープするか、クラス内の先頭または終わりに指定する必要があります。リテラル &dlq;]&drq; の場”るか、またはクラスの先頭に指定します。リテラル &dlq;^&drq; がクラスの”場“ケープする必要があります。

[^ 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 が指定されない場合は、REm 回以上発生することを示します。

( 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]

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

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

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

トランザクション ATMI 呼び出しがトランザクション内部で失敗すると、そのトランザクションは TX_ROLLBACK_ONLY 状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、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)

 

Back to Top Previous Next
Contact e-docsContact BEAwebmasterprivacy