![]() |
![]() |
|
|
イベント・サブスクリプションおよびイベント通知
Jolt を使用してクライアント・アプリケーションを開発するプログラマは、BEA Tuxedo サービスまたはほかの BEA Tuxedo クライアントからイベント通知を受信することができます。Jolt クラス・ライブラリには、イベントに基づく通信を処理するため、次の BEA Tuxedo 通知をサポートするクラスが用意されています。
イベント・サブスクリプション用のクラス
Jolt クラス・ライブラリには、Jolt クライアント・アプリケーション用の非同期通知メカニズムをインプリメントするための 4 つのクラスが用意されています。
これらのクラスについては、『BEA Jolt API Reference』を参照してください。
通知イベント・ハンドラ
Jolt クライアント・アプリケーションでは、任意通知型メッセージとブローカ経由のイベント通知の両方に対してイベント・ハンドラ・ルーチン (通知の受信時に呼び出される) が必要になります。Jolt では、1 セッションでサポートされるハンドラは 1 つです。BEA Tuxedo では、通知の生成元であるイベントを特定することはできません。したがって、特定のイベントが発生したときに、そのイベント特有のハンドラを呼び出すことはできません。
クライアント・アプリケーション側では、セッションごとに 1 つのハンドラを用意 (onReply() メソッドをオーバーライド) し、そのセッションでクライアントが受信するすべての通知に対して呼び出されるようにしなければなりません。単一ハンドラによるコールバック関数は、任意通知型とイベント通知型の両方で使用されます。ハンドラ呼び出しの原因となったイベントを特定し、適切な措置を取ることは (ユーザ定義の) ハンドラ・ルーチンの役割です。ユーザがセッション・ハンドラをオーバーライドしないと、通知メッセージはデフォルトのハンドラによって暗黙のうちに廃棄されます。
Jolt クライアントは、JoltSession クラスのサブクラスを作成し、onReply() メソッドをユーザ定義された onReply() メソッドで上書きすることによって、コールバック関数を提供します。
BEA Tuxedo/ATMI クライアントでは、ハンドラ・コールバック関数内では、ATMI 呼び出しのサブセットしか使うことができません。この制約は、Jolt クライアントには適用されません。別々のスレッドを使用して、通知を監視し、イベント・ハンドラ・メソッドを実行します。Jolt がサポートするすべての機能をハンドラ内から実行することが可能です。Jolt クライアント・プログラムに適用される通常の規則 (1セッションにつき 1 トランザクションなど) は、すべてハンドラにも適用されます。
ハンドラ・メソッドの呼び出しは、独立したスレッド内で行われます。別々のスレッドが onReply() メソッドを同時に実行しないようにするため、アプリケーション開発者は必ずそのメソッドに synchronized キーワードを付けるか、またはそのメソッドがスレッド・セーフになるように記述します。
Jolt では、ハンドラのルーティングを有効にする暗黙的なモデルが使用されます。クライアントがイベントをサブスクライブすると、Jolt はそのクライアントのハンドラを内部で有効にしますが、その結果、任意通知型メッセージの受信も有効になります。Jolt クライアントがイベント通知をサブスクライブする場合は、同時に必ず任意通知型メッセージも受信します。さらに、これらの 2 種類の通知に対して、単一の onReply() メソッドが呼び出されます。
コネクション・モード
Jolt は、コネクション・モード (RETAINED) またはコネクションレス・モード (RECONNECT) で稼動しているクライアントの通知受信をサポートします。コネクション・モード (RETAINED) のクライアントは、すべての通知を受信します。コネクションレス・モード (RECONNECT) モードで動作する Jolt クライアントは、Jolt セッション・ハンドラ (JSH) へのネットワーク接続がアクティブな間は通知を受信します。ネットワーク接続が切断されている場合、JSH はクライアント宛ての通知のログを記録し、その通知を廃棄します。コネクションレス・モード (RECONNECT) で稼動している Jolt クライアントは、ネットワーク接続がアクティブでない間は任意通知型メッセージまたはイベント通知を受信しません。この間に受信されたメッセージは、JSHによって記録され、廃棄されます。
コネクション・モードでの通知処理には、BEA Tuxedo 環境での Jolt クライアントへの確認付きメッセージ通知の処理も含まれます。JSH がクライアントへの確認付きメッセージ通知を受信し、そのクライアントに対してアクティブなネットワーク接続が確立されていない場合、JSH はエラーのログを記録し、通知メッセージに対して不成功を示す確認を返します。
通知データ・バッファ
クライアントが通知を受信する場合、通知にはデータ・バッファが付随しています。データ・バッファはどの BEA Tuxedo データ・バッファ型でもかまいません。Jolt クライアント (ハンドラ) はこれらのバッファを JoltMessage オブジェクトとして受信し、適切な JoltMessage クラスの get*() メソッドを使用してこのオブジェクトからデータを取り出します。
通知に使用するバッファの定義を Jolt リポジトリに格納する必要はありません。ただし、Jolt クライアント・アプリケーションのプログラマは、フィールド名を知っておく必要があります。
Jolt システムには、BEA Tuxedo の tptypes() と同様の機能はありません。FML および VIEW のバッファ型の場合は、適切なフィールド名を指定して get*() メソッドを使用してデータにアクセスします。たとえば、次のように入力します。
getIntDef ("ACCOUNT_ID", -1);
STRING および CARRAY のバッファ型の場合は、バッファ型と同じ名前でデータにアクセスします。たとえば、次のように入力します。
getStringDef ("STRING", null);
getBytesDef ("CARRAY", null);
STRING と CARRAY のバッファ型には、単一のデータ・エレメントしか含まれていません。このエレメント全体は、get*() メソッドで返されます。
BEA Tuxedo のイベント・サブスクリプション
BEA Tuxedo のブローカ経由のイベント通知により、BEA Tuxedo プログラムは、どのプログラムがイベントの発生通知を受信するかを気にしないで、イベントをポストすることができます。また、Jolt のイベント通知機能により、Jolt クライアント・アプリケーションは、BEA Tuxedo の tpnotify() または tpbroadcast() を呼び出してブロードキャストまたはポストされる BEA Tuxedo イベントをサブスクライブすることができます。
Jolt クライアントがサブスクライブできるのは、BEA Tuxedo の他のコンポーネントによって生成されたイベントまたはメッセージ通知 (BEA Tuxedo のサービスまたはクライアントなど) のみです。Jolt クライアントは、イベントまたはメッセージ通知を送信することはできません。
サポートされているサブスクリプションの種類
Jolt では、メッセージ通知型のサブスクリプションしかサポートされません。サブスクリプションが実行されると onReply() メソッドが呼び出されます。Jolt の API では、メッセージ通知の受信時にサービス・ルーチンをディスパッチしたり、アプリケーション・キューにメッセージを入れる機能はサポートされていません。
通知をサブスクライブする
Jolt クライアントが単一のイベント通知をサブスクライブする場合、クライアントは、任意通知型メッセージとイベント通知を両方とも受信します。イベントをサブスクライブすることにより、暗黙的に任意通知型メッセージも利用できるようになります。つまり、たとえばアプリケーションがイベント X に対して JoltUserEvent オブジェクトを作成した場合に tpnotify() または tpbroadcast() を呼び出すと、クライアントは自分宛てのメッセージを自動的に受信します。
注記 単一のイベント通知をサブスクライブするために任意通知型メッセージを用いることはお勧めしません。任意通知型メッセージを受信したい場合は、アプリケーション側で明示的に指定してください (JoltUserEvent クラスで説明)。次の節では、通知のアンサブスクライブについて説明します。
通知をアンサブスクライブする
イベント通知または任意通知型メッセージのいずれか、または両方のサブスクライブを停止するには、JoltUserEvent の unsubscribe メソッドを使う必要があります。Jolt では、unsubscribe メソッドを使用して任意通知型メッセージの受信を停止しても、すべてのサブスクリプション通知が停止されるわけではありません。この点が BEA Tuxedo と異なります。BEA Tuxedo では、NULL ハンドラを指定して tpsetunsol() を呼び出すと、すべてのサブスクリプション通知が停止します。
イベントの通知をアンサブスクライブする場合、次の点に注意してください。
クライアント・アプリケーションで任意通知型メッセージの受信を停止したい場合は、すべてのイベントをアンサブスクライブする必要があります。
Jolt API を使用して BEA Tuxedo からの通知を受信する
リストの「非同期型通知」のコード例は、Jolt クラス・ライブラリを使用して通知を受信する方法を示しています。ここでは、JoltSession クラス、JoltReply クラス、JoltMessage 、および JoltUserEvent クラスが使用されています。
非同期型通知
class EventSession extends JoltSession
{
public EventSession( JoltSessionAttributes attr, String user,
String role, String upass, String apass )
{
super(attr, user, role, upass, apass);
}
/**
* Override the default unsolicited message handler.
* @param reply a place holder for the unsolicited message
* @see bea.jolt.JoltReply
*/
public void onReply( JoltReply reply )
{
// 1 つのフィールドしか含まない STRING バッファ型のメッセージを
// 印刷します。フィールド名は、"STRING" でなければなりません。
// メッセージに CARRAY バッファ型を使用する場合、フィールド名は
//"CARRAY" でなければなりません。その他のバッファの場合は、フィールド名は
//FML または VIEW の要素に従っていなければなりません。
JoltMessage msg = (JoltMessage) reply.getMessage();
System.out.println(msg.getStringDef("STRING", "No Msg"));
}
public static void main( Strings args[] )
{
JoltUserEvent unsolEvent;
JoltUserEvent helloEvent;
EventSession session;
...
// 任意通知型メッセージを印刷できる独自のセッション・オブジェクトを
//インスタンス化します。次に、メッセージに STRING バッファ型を使用する、
// HELLO イベントと任意通知型メッセージを
// サブスクライブします。
session = new EventSession(...);
helloEvent = new JoltUserEvent("HELLO", null, session);
unsolEvent = new JoltUserEvent(JoltUserEvent.UNSOLMSG, null,
session);
...
// HELLO イベントと任意通知型メッセージのサブスクライブを停止します。
helloEvent.unsubscribe();
unsolEvent.unsubscribe();
}
}
![]() |
![]() |
![]() |
|
Copyright © 2001 BEA Systems, Inc. All rights reserved.
|