MDB 以外のイベント・コンシューマーの開発

非メッセージ駆動 Bean を使用してイベント・コンシューマーを作成することもできます。

このタスクを実行する理由と時期

メッセージ・ドリブン Bean 以外のイベント・コンシュー マーを書き込むためには、ステップに従ってください。

このタスクのステップ

  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. 通知ヘルパーを使用して JMS 宛先を検索し、以下にサブスクライブします。

    各イベント・グループは、単一の JMS トピックおよび任 意の数の JMS キューに関連することが可能です。 通知ヘルパーを照会して、特定のイベント・グループにどの宛先が関連しているかを検出することができます。

    イベント・グループに関連付けられているトピックを検索するには、イベント・グループの名前を指定した NotificationHelper の getJmsTopic(String) メソッドを使用します。
    MessagePort msgPort = notificationHelper.getJmsTopic("critical_events");
    イベント・グループに関連付けられているキューを検索するには、getJmsQueues(String) メソッドを使用します。
    MessagePort[] msgPorts = notificationHelper.getJmsQueues("critical_events"); 
    戻されるオブジェクトは、JMS トピックを表す単一 MessagePort オブジェクトか、JMS キューを表す MessagePort オブジェクトの配列です。 MessagePort インスタンスは、宛先の JNDI 名とその接続ファクトリーを含むラッパー・オブジェクトです。
  4. 宛先に接続します。 MessagePort の getter メソッドを使用して、宛先および接続ファクトリーの JNDI 名をリトリーブします。 次に、標準 JMS インターフェースを使用して、宛先に接続することができます。 以下のコード・フラグメントは、JMS トピックにサブスクライブします。
    String connectionFactoryName = msgPort.getConnectionFactoryJndiName();
    String destinationName = msgPort.getDestinationJndiName();
    
    // create connection and session
    ConnectionFactory connectionFactory =
         (ConnectionFactory) context.lookup(connectionFactoryName);
    Connection connection = connectionFactory.createConnection();
    Session session = connection.createSesion(false,
                                              Session.CLIENT_ACKNOWLEDGE);
    
    // Create consumer and register listener
    Topic topic = (Topic) context.lookup(destinationName);
    MessageConsumer consumer = session.createConsumer(topic);
    consumer.setMessageListener(this);
    connection.start();
  5. 受信したメッセージをイベント通知に変換します。

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

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

ご利用条件 |


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