J2EE イベント・コンシューマーは、メッセージ駆動型 Bean として実装され、デプロイメント時に JMS 宛先および接続ファクトリーに関連付けされます。
イベントを受信するには、以下のステップを実行します。
このタスクの手順
- 通知ヘルパーを取得します。 JMS イベント・コンシューマーは通知ヘルパーを使用して、イベント・グループに関連した JMS 宛先を識別し、受信した JMS メッセージをイベント通知に変換し、さらに受信したイベントのフィルタリングを実行します。
通知ヘルパーを取得するには、JNDI ネームスペースにバインドされている NotificationHelperFactory のインスタンスである、通知ヘルパー・ファクトリーを使用します。 以下のコード・フラグメントでは、通知ヘルパー・ファクトリーを使用して通知ヘルパーを取得しています。
// Get notification helper factory from JNDI
InitialContext context = new InitialContext();
Object notificationHelperFactoryObject =
context.lookup("com/ibm/events/NotificationHelperFactory");
NotificationHelperFactory nhFactory = (NotificationHelperFactory)
PortableRemoteObject.narrow(notificationHelperFactoryObject,
NotificationHelperFactory.class);
// Create notification helper
NotificationHelper notificationHelper =
nhFactory.getNotificationHelper();
- オプション: イベント・セレクターを指定します。 受信したイベントをフィルタリングする場合は、setEventSelector() メソッドを使用して、通知ヘルパーにイベント・セレクターを設定できます。
イベント・コンシューマーは、その通知ヘルパーを使用し、イベント・セレクターに照らし合わせて受信したイベントを検査します。 以下のコード・フラグメントでは、重大度が 30 (警告) より大きいイベントを指定したイベント・セレクターを設定しています。
notificationHelper.setEventSelector("CommonBaseEvent[@severity > 30]");
- 受信したメッセージをイベント通知に変換します。
ご使用のリスナーの onMessage() メソッドにおいて、通知ヘルパーを使用し、各受信 JMS メッセージをイベント通知が収容された配列に変換します。
(イベントが通知ヘルパーで指定されたイベント・セレクターに一致しない場合、配列は空になります。)
イベント通知は、EventNotification インターフェースを実装したクラスのインスタンスです。
public void onMessage(Message msg) {
EventNotification[] notifications =
notificationHelper.getEventNotifications(msg);
// ...
- 通知タイプを確認し、対応するイベント・データを取得します。 それぞれのイベント通知には、通知タイプを表すフィールドがあります (その値が NotificationHelper インターフェースで定義された通知タイプ定数のいずれかである整数)。
以下の 3 つの通知タイプが現在サポートされています。
通知タイプ |
説明 |
CREATE_EVENT
_NOTIFICATION_TYPE
|
新規イベントが、宛先に関連付けられたイベント・グループに作成されています。
これは、新規イベントが送信されたか、または既存のイベントがイベント・グループ定義に一致するように変更されたかのいずれかを意味します。
その通知には、完全なイベント・データも含まれています。 |
REMOVE_EVENT
_NOTIFICATION_TYPE
|
イベント・データベースに保管されたイベントが、宛先に関連付けられたイベント・グループから削除されています。
これは、イベントがイベント・データベースから削除されたか、または既存のイベントがイベント・グループ定義に一致しないように変更されたかのいずれかを意味します。
その通知には、削除されたイベントのグローバル・インスタンス ID も含まれています。 |
UPDATE_EVENT
_NOTIFICATION_TYPE
|
イベント・データベースに保管されたイベントが、宛先に関連付けられたイベント・グループにおけるメンバーシップを変更しない方法で更新されています。
その通知には、完全なイベント・データも含まれています。 |
EventNotification の getNotificationType() メソッドを使用して、受信した各通知の通知タイプを確認します。
その通知タイプを基にして、以下のように、イベント・コンシューマーでその通知をさらに処理するかどうかを判断し、その通知に含まれているイベント・データの種類を判別することができます。
- 通知タイプが CREATE_EVENT_NOTIFICATION_TYPE または UPDATE_EVENT_NOTIFICATION_TYPE である場合、コンシューマーは EventNotification.getEvent() を使用して、新規または更新済みのイベントを取得できます。
このメソッドは、新規または更新済みのイベントの通知に対してのみ有効です。
- 通知が REMOVE_EVENT_NOTIFICATION_TYPE である場合、コンシューマーは EventNotification.getGlobalInstanceId() を使用して、削除されたイベントのグローバル・インスタンス ID を取得できます。
このメソッドは、削除されたイベントの通知に対してのみ有効です。
for (int i = 0; i < notifications.length; i++)
{
int notifType = notifications[i].getNotificationType();
if(notifType == NotificationHelper.CREATE_EVENT_NOTIFICATION_TYPE)
{
CommonBaseEvent event = notifications[i].getEvent();
if (event != null) {
// process the new event
// ...
}
}
else if(notifType == NotificationHelper.UPDATE_EVENT_NOTIFICATION_TYPE)
{
CommonBaseEvent event = notifications[i].getEvent();
if (event != null) {
// process the updated event
// ...
}
}
else if(notifType == NotificationHelper.REMOVE_EVENT_NOTIFICATION_TYPE)
{
String eventId = notifications.[i].getGlobalInstanceId();
// process the event deletion
// ...
}
}
次のタスク
メッセージ駆動型 Bean は、そのデプロイメント記述子において、JMS 宛先および接続ファクトリーを指定するリスナー・ポートに自分自身を関連付ける必要があります。
MDB をデプロイする前に、イベントを受信するイベント・グループに関連付けされた宛先および接続ファクトリーを指定して、ご使用のイベント・コンシューマー用のリスナー・ポートを作成する必要があります (それらはイベント・グループ・プロファイルで定義されます)。
注: MDB のデプロイ時には、CommonEventInfrastructure_ListenerPort リスナー・ポートを使用しないでください。
このリスナー・ポートは、イベント・サーバーにより使用されるポートであり、イベント・コンシューマーを対象としていません。