メッセージ・ドリブン Bean (MDB) としてのイベント・コンシューマーの開発

J2EE イベント・コンシューマーは、メッセージ・ドリブン Bean としてインプリメントされます。メッセージ・ドリブン Bean は、デプロイメント時に JMS 宛先および接続ファクトリーに関連付けられます。イベントを受信するには、以下のステップに従ってください。

このタスクのステップ

  1. 通知ヘルパーを入手します。 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();
                                          
  2. オプション: イベント・セレクターを指定します。 受信したイベントをフィルター処理する場合は、setEventSelector() メソッドを使用して通知ヘルパーにイベント・セレクターを設定できます。次に、イベント・コンシューマーは通知ヘルパーを使用して、イベント・セレクターに対して受信したイベントを確認することができます。 以下のコード・フラグメントでは、重大度が 30 (警告) より大きいイベントを指定するイベント・セレクターを設定します。
    notificationHelper.setEventSelector("CommonBaseEvent[@severity > 30]");
  3. 受信したメッセージをイベント通知に変換します。

    リスナーの onMessage() メソッドで、 通知ヘルパーを使用して、受信した各 JMS メッセージを、イベント通知を含む配列に変換します。 (イベントが通知ヘルパーで指定されたイベント・セレクターと一致しない場合、配列は空です。) イベント通知は、EventNotification インターフェースをインプリメントするクラスのインスタンスです。

    public void onMessage(Message msg) {
      EventNotification[] notifications = 
                          notificationHelper.getEventNotifications(msg);
      // ...
  4. 通知タイプを検査し、イベント・データを適切に検索します。 各イベント通知には通知タイプを表すフィールドがあります (整数で、その値は、NotificationHelper インターフェースで定義される通知タイプ定数の 1 つです)。以下の 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
        // ...
      }
    }

次に実行する作業

JMS 宛先および接続ファクトリーを指定するデプロイメント記述子内で、メッセージ・ドリブン Bean を リスナー・ポートと関連付ける必要があります。 イベントを受信するイベント・グループに関連する宛先と接続ファクトリー (これはイベント・グループ・プロファイルに定義されている) を指定して、MDB をデプロイする前にイベント・コンシューマー向けのリスナー・ポートを作成する必要があります。
注: MDB をデプロイする際に CommonEventInfrastructure_ListenerPort リスナー・ポートを使用しないでください。このリスナー・ポートは、イベント・サーバーによって使用され、イベント・コンシューマーによる使用は意図されていません。

ご利用条件 |


(c) Copyright IBM Corporation 2005, 2006.
本製品では Eclipse テクノロジーが採用されています。(http://www.eclipse.org)