WebSphere WebSphere Enterprise Service Bus, Version 6.0.1 オペレーティング・システム: AIX, HP-UX, Linux, Solaris, Windows

非 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 インターフェースで定義された通知タイプ定数のいずれかである整数)。 以下の 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
        // ...
      }
    }

Task topic

ご利用条件 | フィードバック (英語のみ)

Timestamp icon最終更新: 5 Mar 2006
http://publib.boulder.ibm.com/infocenter/dmndhelp/v6rxmx/index.jsp?topic=/com.ibm.websphere.wesb.doc.nl1_6.0.1\doc\tcei_admin_nonMDBEventConsumer.html

(C) Copyright IBM Corporation 2005. All Rights Reserved.
このインフォメーション・センターでは Eclipse テクノロジーが採用されています。(http://www.eclipse.org)