WebSphere WebSphere Enterprise Service Bus, Version 6.0.1 作業系統: AIX, HP-UX, Linux, Solaris, Windows

開發非 MDB 事件使用端

您也可以使用非訊息驅動 Bean 來建立事件使用端。

執行這項作業的原因和時機

如果要撰寫一個非訊息驅動 Bean 的事件使用端,請遵循下列步驟:

這項作業的步驟

  1. 取得通知 Helper。 JMS 事件使用端會使用通知 Helper 來識別與事件群組相關聯的 JMS 目的地, 將收到的 JMS 訊息轉換成事件通知,再過濾收到的事件。如果要取得通知 Helper,請使用通知 Helper Factory,這是已連結至 JNDI 名稱空間的 NotificationHelperFactory 實例。 下列程式碼片段會使用通知 Helper Factory 來取得通知 Helper。
    // 從 JNDI 取得通知 Helper Factory
    InitialContext    context            = new InitialContext();
    Object notificationHelperFactoryObject = 
      context.lookup("com/ibm/events/NotificationHelperFactory");
    NotificationHelperFactory nhFactory = (NotificationHelperFactory) 
      PortableRemoteObject.narrow(notificationHelperFactoryObject,
                                  NotificationHelperFactory.class);
    
    // 建立通知 Helper
    NotificationHelper notificationHelper =
      nhFactory.getNotificationHelper();
                                          
  2. 選擇性的: 指定事件選取器。 如果您要過濾收到的事件, 您可以利用 setEventSelector() 方法,對通知 Helper 設定事件選取器。接著,您的事件使用端可以使用通知 Helper,針對事件選取器來檢查收到的事件。 下列程式碼片段會設定一個事件選取器, 指定嚴重性大於 30(警告)的事件。
    notificationHelper.setEventSelector("CommonBaseEvent[@severity > 30]");
  3. 使用通知 Helper 來尋找要訂閱的 JMS 目的地。

    每一個事件群組可以與單一 JMS 主題和任何數量的 JMS 佇列相關聯。 您可以查詢通知 Helper,以瞭解與特定事件群組相關聯的目的地。

    如果找到與事件群組相關聯的主題,請利用 NotificationHelper 的 getJmsTopic(String) 方法來指定事件群組的名稱:
    MessagePort msgPort = notificationHelper.getJmsTopic("critical_events");
    如果要找到與事件群組相關聯的佇列,請使用 getJmsQueues(String) 方法:
    MessagePort[] msgPorts = notificationHelper.getJmsQueues("critical_events"); 
    傳回的物件是代表 JMS 主題的單一 MessagePort 物件,或是代表 JMS 佇列的 MessagePort 物件陣列。 MessagePort 實例是一個封套 (wrapper) 物件,它包含目的地的 JNDI 名稱及其 Connection Factory。
  4. 連接到目的地。 您可以使用 MessagePort 的 getter 方法來擷取目的地和 Connection Factory 的 JNDI 名稱。然後您可以利用標準 JMS 介面來連接到目的地。 下列程式碼片段訂閱一個 JMS 主題:
    String connectionFactoryName = msgPort.getConnectionFactoryJndiName();
    String destinationName = msgPort.getDestinationJndiName();
    
    // 建立連線和階段作業
    ConnectionFactory connectionFactory =
         (ConnectionFactory) context.lookup(connectionFactoryName);
    Connection connection = connectionFactory.createConnection();
    Session session = connection.createSesion(false,
                                              Session.CLIENT_ACKNOWLEDGE);
    
    // 建立使用端程式和登錄接聽器
    Topic topic = (Topic) context.lookup(destinationName);
    MessageConsumer consumer = session.createConsumer(topic);
    consumer.setMessageListener(this);
    connection.start();
  5. 將收到的訊息轉換成事件通知。

    在接聽器的 onMessage() 方法中,請使用通知 Helper 將每個收到的 JMS 訊息轉換成含有事件通知的陣列。 (如果事件與通知 Helper 上指定的事件選取器不符, 陣列會是空的。)事件通知是實作 EventNotification 介面之類別的實例。

    public void onMessage(Message msg) {
      EventNotification[] notifications = 
                          notificationHelper.getEventNotifications(msg);
      // ...
  6. 檢查通知類型,並視狀況擷取事件資料。 每一個事件通知都有一個代表通知類型的欄位(其值為 NotificationHelper 介面所定義之其中一個通知類型常數的整數)。目前支援三種通知類型:
    通知類型 說明

    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) {
          // 處理新的事件
          // ...
        }
      }
    
      else if(notifType == NotificationHelper.UPDATE_EVENT_NOTIFICATION_TYPE)
      {
        CommonBaseEvent event = notifications[i].getEvent();
        if (event != null) {
          // 處理更新的事件
          // ...
        }
      }
    
      else if(notifType == NotificationHelper.REMOVE_EVENT_NOTIFICATION_TYPE)
      {
        String eventId = notifications.[i].getGlobalInstanceId();
        // 處理刪除事件
        // ...
      }
    }

Task topic

使用條款 | 此頁的評等

「時間戳記」圖示前次更新: 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)