您也可以使用非訊息驅動 Bean 來建立事件使用端。
// 從 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();
notificationHelper.setEventSelector("CommonBaseEvent[@severity > 30]");
每一個事件群組可以與單一 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。
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();
在接聽器的 onMessage() 方法中,請使用通知 Helper 將每個收到的 JMS 訊息轉換成含有事件通知的陣列。 (如果事件與通知 Helper 上指定的事件選取器不符, 陣列會是空的。)事件通知是實作 EventNotification 介面之類別的實例。
public void onMessage(Message msg) { EventNotification[] notifications = notificationHelper.getEventNotifications(msg); // ...
通知類型 | 說明 |
---|---|
CREATE_EVENT _NOTIFICATION_TYPE |
新的事件已建立在與目的地相關聯的事件群組中。這表示已傳送新的事件; 或是現有的事件已變更,使其現在符合事件群組定義。通知也含有完整的事件資料。 |
REMOVE_EVENT _NOTIFICATION_TYPE |
儲存在事件資料庫中的事件,已從與目的地相關聯的事件群組中移除。這表示已從事件資料庫中刪除事件; 或是現有的事件已變更,使其不再符合事件群組定義。通知也含有已刪除事件的廣域實例 ID。 |
UPDATE_EVENT _NOTIFICATION_TYPE |
儲存在事件資料庫中的事件已更新, 但未變更其在與目的地相關聯之事件群組中的成員資格。通知也含有完整的事件資料。 |
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(); // 處理刪除事件 // ... } }