|
|
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 要素に指定する、イベントをサブスクライブするための制御オプションの有効なビットの一覧を示します。
イベント・ブローカのアクティブなサブスクリプションのリストに、tpsubscribe() が要求するサブスクリプションと一致するものがある場合は、この関数は異常終了して tperrno() に TPEMATCH を設定します。サブスクリプションが既存のサブスクリプションと一致するためには、eventexpr と filter の両方が、イベント・ブローカのアクティブなサブスクリプションのリストにすでに存在するサブスクリプションの eventexpr と filter に一致しなければなりません。さらに、通知メソッドによって異なりますが、一致を調べるために他の基準も使用されます。
サブスクライバがBEA Tuxedo ATMI システムのクライアント・プロセスで、(イベントがポストされたときに、呼び出し元が任意通知を受け取るように) ctl に NULL を設定した場合は、システム定義によるそのクライアント識別子 (CLIENTID と呼ばれています) も一致を調べるために使用されます。つまり tpsubscribe() は、eventexpr、filter、および呼び出し元の CLIENTID が、イベント・ブローカにすでに知られているサブスクリプションが持つそれらの値と一致する場合に異常終了します。
呼び出し元が ctl->flags に TPEVSERVICE を設定した場合は、eventexpr、filter、および ctl->name1 に設定されたサービス名が、イベント・ブローカにすでに知られているサブスクリプションが持つそれらの値と一致する場合に tpsubscribe() は異常終了します。
安定記憶域内のキュー、キュー・スペース、およびキューの名前へのサブスクリプションの場合は、一致を調べる際に eventexpr および filter に加えて相関識別子が使用されます。相関識別子は、同じイベント表現とフィルタ・ルールを持ち、同じキューに向けられている複数のサブスクリプションを区別するために使用できます。したがって、呼び出し元が ctl->flags に TPEVQUEUE を設定し、ctl->qctl.flags に TPQCOORID が設定されなかった場合、eventexpr、filter、ctl->name1 に設定されたキュー・スペース名、および ctl->name2 に設定されたキュー名が、イベント・ブローカにすでに知られている (相関識別子が指定された) サブスクリプションが持つそれらの値と一致すると tpsubscribe() は異常終了します。さらに、ctl->qctl.flags に TPQCOORID が設定されている場合は、eventexpr、filter、ctl->name1、ctl->name2、および ctl->qctl.corrid がイベント・ブローカに既に知られている (同じ相関識別子が指定された) サブスクリプションのデータと一致すると、tpsubscribe() は異常終了します。
次に tpsubscribe() に指定できる有効な flags の一覧を示します。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは、tpsubscribe() の呼び出しを発行できません。
正規表現
表 12 で説明する正規表現は、UNIX システム・エディタ、ed(1) で使用されるパターンに似ています。一般的な正規表現のほか、代替演算子 (|) も使用できます。 ただし、全体的にはほとんど変わりません。
正規表現 (RE: Regular Expression) は、次に示すいずれかの規則を 1 回以上適用して作成します。
優先順位のレベルは 3 つあります。結合の強さの順に並べると、次のようになります。
上記のとおり、かっこは、優先順位が高いことを明示的に示すために使用します。
戻り値
tpsubscribe() は正常終了すると、イベント・ブローカのアクティブなサブスクリプションのリストからこのサブスクリプションを削除するために使用できるハンドルを返します。サブスクライバやその他のプロセスは、いずれも返されたハンドルを利用してこのサブスクリプションを削除することができます。
異常終了すると、tpsubscribe() は -1 を返し、tperrno() を設定してエラー条件を示します。
エラー
異常終了時には、tpsubscribe() は tperrno() を次のいずれかの値に設定します(特に指定がない限り、障害は、呼び出し元のトランザクションに影響しません)。
関連項目
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)
|
Copyright © 2001 BEA Systems, Inc. All rights reserved.
|