WebSphere WebSphere Enterprise Service Bus V6.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 接口定义的其中一个通知类型常量)。当前支持三种通知类型:
    通知类型 描述

    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
        // ...
      }
    }

任务主题

使用条款 | 评价此页

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_nonMDBEventConsumer.html

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