WebSphere WebSphere Enterprise Service Bus V6.0.1 操作系统: AIX, HP-UX, Linux, Solaris, Windows

将事件使用者开发为消息驱动的 bean(MDB)

J2EE 事件使用者将实现为消息驱动的 bean,它在部署时与 JMS 目标及连接工厂相关联。要接收事件,按这些步骤进行操作:

完成此任务需要执行的步骤

  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. 将已接收到的消息转换为事件通知。

    在侦听器的 onMessage() 方法中,使用通知辅助控件将每个已接收到的 JMS 消息转换为包含事件通知的数组。(如果该事件与通知辅助控件中指定的事件选择器不匹配,则该数组是空的。)事件通知是实现 EventNotification 接口的类的实例。

    public void onMessage(Message msg) {
      EventNotification[] notifications = 
                          notificationHelper.getEventNotifications(msg);
      // ...
  4. 检查通知类型并在适当时检索事件数据。 每个事件通知都有一个表示通知类型的字段(这是一个整数,它的值是 NotificationHelper 接口定义的其中一个通知类型常量)。当前支持三种通知类型:
    通知类型 描述

    CREATE_EVENT

    _NOTIFICATION_TYPE

    已在与目标相关联的事件组中创建了新事件。这表示新事件已发送或者现有事件已发生变化,所以它现在与事件组定义相匹配。该通知还包含完整事件数据。

    REMOVE_EVENT

    _NOTIFICATION_TYPE

    已从与目标相关联的事件组中除去存储在事件数据库中的事。这表示 已从事件数据库中删除新事件或者现有事件已发生变化,所以它不再与事件组定义相匹配。该通知还包 含已删除事件的全局实例标识。

    UPDATE_EVENT

    _NOTIFICATION_TYPE

    已经按某种方式对存储在事件数据库中的事件进行了更新,这种更新方式不会改变它在与目标相关联的事件组中的成员资格。该通知还包含完整事件数据。
    使用 EventNotification 的 getNotificationType() 方法来检查每个已接收通知的通知类型。根据通知类型,可确定事件使用者是否应该进一步处理通知以及该通知包含的事件数据种类:
    • 如果通知类型为 CREATE_EVENT_NOTIFICATION_TYPE 或 UPDATE_EVENT_NOTIFICATION_TYPE,则使用者可以使用 EventNotification.getEvent() 来尝试检索新事件或已更新事件。此方法仅对新事件或已更新事件的通知有效。
    • 如果通知为 REMOVE_EVENT_NOTIFICATION_TYPE,则使用者可使用 EventNotification.getGlobalInstanceId() 来检索已删除事件的全局实例标识。此方法仅对已删除事件的通知有效。
    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
        // ...
      }
    }

下一步做什么?

在其部署描述符中,消息驱动的 bean 必须与侦听器端口相关联,该端口指定 JMS 目标和连接工厂。在部署 MDB 之前,必须为事件使用者创建侦听器端口,指定与从中接收事件(它们是在事 件组概要文件中定义的)的事件组关联的目标和连接工厂。
注: 在部署 MDB 时,不要使用 CommonEventInfrastructure_ListenerPort 侦听器端口。这个侦听器端口将由事件服务器使用,而不是供事件使用者使用。

任务主题

使用条款 | 评价此页

Timestamp icon上次更新时间: 3 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_MDBEventConsumer.html

(C) Copyright IBM Corporation 2005, 2006. All Rights Reserved.
本信息中心基于 Eclipse 技术。(http://www.eclipse.org)