J2EE 事件使用端是以訊息驅動 Bean 的形式來實作,其在部署時會與一個 JMS 目的地和 Connection Factory 相關聯。
如果要接收事件,請遵循下列步驟:
這項作業的步驟
- 取得通知 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();
- 選擇性的: 指定事件選取器。 如果您要過濾收到的事件,
您可以利用 setEventSelector() 方法,對通知 Helper 設定事件選取器。接著,您的事件使用端可以使用通知 Helper,針對事件選取器來檢查收到的事件。 下列程式碼片段會設定一個事件選取器,
指定嚴重性大於 30(警告)的事件。
notificationHelper.setEventSelector("CommonBaseEvent[@severity > 30]");
- 將收到的訊息轉換成事件通知。
在接聽器的
onMessage() 方法中,請使用通知 Helper 將每個收到的 JMS 訊息轉換成含有事件通知的陣列。
(如果事件與通知 Helper 上指定的事件選取器不符,
陣列會是空的。)事件通知是實作 EventNotification 介面之類別的實例。
public void onMessage(Message msg) {
EventNotification[] notifications =
notificationHelper.getEventNotifications(msg);
// ...
- 檢查通知類型,並視狀況擷取事件資料。 每一個事件通知都有一個代表通知類型的欄位(其值為 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();
// 處理刪除事件
// ...
}
}
下一步
在其部署描述子中,訊息驅動 Bean 必須與某個接聽器埠相關聯,其會指定 JMS 目的地和 Connection Factory。您必須在部署 MDB 之前先建立事件使用端的接聽器埠,
指定與要用來接收事件之事件群組相關聯的目的地和 Connection Factory(這些定義在事件群組設定檔中)。
註: 當您部署 MDB 時,請勿使用 CommonEventInfrastructure_ListenerPort 接聽器埠。
這個接聽器埠是由事件伺服器使用,而不是供事件使用端使用。