Desarrollo de un consumidor de sucesos que no sea MDB

También se puede crear un consumidor de sucesos que no sea un bean controlado por mensaje.

Por qué y cuándo realizar esta tarea

Para escribir un consumidor de sucesos que no sea un bean controlado por mensaje, siga los pasos siguientes:

Pasos para realizar esta tarea

  1. Obtenga una ayuda de notificación. Los consumidores de sucesos JMS utilizan la ayuda de notificación para identificar los destinos JMS asociados a un grupo de sucesos, para convertir mensajes JMS recibidos en notificaciones de suceso y filtrar sucesos recibidos. Para obtener ayuda de notificación, utilice una fábrica de ayudas de notificación, que es una instancia de NotificationHelperFactory que está enlazada a un espacio de nombres JNDI. El siguiente fragmento de código utiliza una fábrica de ayudas de notificación para obtener una ayuda de notificación.
    // Obtener
    la fábrica de ayudas de notificación de JNDI
    InitialContext context = new InitialContext();
    Object notificationHelperFactoryObject =
      context.lookup("com/ibm/events/NotificationHelperFactory");
    NotificationHelperFactory nhFactory = (NotificationHelperFactory)
      PortableRemoteObject.narrow(notificationHelperFactoryObject,
                                  NotificationHelperFactory.class);
    
    // Crear la ayuda de notificación
    NotificationHelper notificationHelper =
      nhFactory.getNotificationHelper();
                                          
  2. Opcional: Especifica el selector de sucesos. Si desea filtrar los sucesos recibidos, puede utilizar el método setEventSelector() para establecer un selector de sucesos en la ayuda de notificación. A continuación, su consumidor de sucesos puede utilizar la ayuda de notificación para contrastar los sucesos recibidos con el selector de sucesos. EL siguiente código de fragmento establece un selector de sucesos que especifica los sucesos con una gravedad superior a 30 (aviso).
    notificationHelper.setEventSelector("CommonBaseEvent[@severity > 30]");
  3. Utilice la ayuda de notificación para buscar los destinos a los que suscribirse JMS.

    Cada grupo de sucesos puede asociarse con un tema JMS único y cualquier número de colas JMS. Puede consultar la ayuda de notificación para averiguar que destinos están asociados con el grupo de sucesos determinado.

    Para buscar el tema asociado a un grupo de sucesos, utilice el método getJmsTopic(String) de NotificationHelper, especificando el nombre del grupo de sucesos:
    MessagePort msgPort = notificationHelper.getJmsTopic("critical_events");
    Para buscar las colas asociadas con un grupo de sucesos, utilice el método getJmsQueues(String):
    MessagePort[] msgPorts = notificationHelper.getJmsQueues("critical_events"); 
    El objeto devuelto es un único objeto MessagePort que represente un temas o una matriz de objetos MessagePort que represente colas JMS. Una instancia MessagePort es un objeto de envoltorio que contiene los nombres JNDI del destino y su fábrica de conexiones.
  4. Conéctese al destino. Utilice los métodos getter de MessagePort para recuperar los nombres JNDI del destino y de la fábrica de conexiones. A continuación, puede utilizar las interfaces JMS para conectarse al destino. El fragmento de código siguiente se suscribe a un tema JMS:
    String connectionFactoryName = msgPort.getConnectionFactoryJndiName();
    String destinationName = msgPort.getDestinationJndiName();
    
    // crear una conexión y una sesión
    ConnectionFactory connectionFactory =
         (ConnectionFactory) context.lookup(connectionFactoryName);
    Connection connection = connectionFactory.createConnection();
    Session session = connection.createSesion(false,
                                              Session.CLIENT_ACKNOWLEDGE);
    
    // Crear un consumidor y un receptor de registro
    Topic topic = (Topic) context.lookup(destinationName);
    MessageConsumer consumer = session.createConsumer(topic);
    consumer.setMessageListener(this);
    connection.start();
  5. Convierta los mensajes recibidos en notificaciones de suceso.

    En el método onMessage() del receptor, utilice la ayuda de notificación para convertir todos los mensajes JMS recibidos a una matriz que contiene notificaciones de sucesos. (Si el suceso recibido no coincide con el selector de sucesos especificado en la ayuda de notificación, la matriz está vacía). Una notificación de suceso es una instancia de una clase que implementa la interfaz EventNotification.

    public void onMessage(Message msg) {
      EventNotification[] notifications =
                          notificationHelper.getEventNotifications(msg);
      // ...
  6. Compruebe el tipo de notificación y recupere los datos de suceso según sea adecuado. Cada notificación de suceso tiene un campo que representa el tipo de notificación (un entero cuyo valor es una de las constantes de tipo de notificación definidas por la interfaz NotificationHelper). Actualmente se admiten tres tipos de notificación:
    Tipo de notificación Descripción

    CREATE_EVENT

    _NOTIFICATION_TYPE

    Se ha creado un nuevo suceso del grupo de sucesos asociado al destino. Esto significa que, o bien, se ha enviado un suceso, o bien, que ha cambiado un suceso existente de modo que ahora coincide con la definición de grupo de sucesos. La notificación también contiene los datos completos del suceso.

    REMOVE_EVENT

    _NOTIFICATION_TYPE

    Se ha eliminado un suceso almacenado en la base de datos de sucesos del grupo de sucesos asociado al destino. Esto significa que, o bien, se ha suprimido un suceso de la base de datos de sucesos, o bien, que ha cambiado un suceso existente de modo que ya no coincide con la definición de grupo de sucesos. La notificación también contiene el identificador de instancia global del suceso suprimido.

    UPDATE_EVENT

    _NOTIFICATION_TYPE

    Se ha actualizado un suceso almacenado en la base de datos de sucesos, de un modo en que no cambia su relación de miembro en el grupo de sucesos asociado al destino. La notificación también contiene los datos completos del suceso.
    Utilice el método getNotificationType() de EventNotification para comprobar el tipo de notificación de cada notificación recibida. Basándose en el tipo de notificación, puede determinar si el consumidor de sucesos debería procesar más las notificación y qué clase de datos de sucesos contiene la notificación:
    • Si el tipo de notificación es CREATE_EVENT_NOTIFICATION_TYPE o UPDATE_EVENT_NOTIFICATION_TYPE, el consumidor puede utilizar EventNotification.getEvent() para intentar recuperar el suceso nuevo o actualizado. Este método sólo es válido para notificaciones de sucesos nuevos o actualizados.
    • Si la notificación es REMOVE_EVENT_NOTIFICATION_TYPE, el consumidor puede utilizar EventNotification.getGlobalInstanceId() para recuperar el identificador de instancia global del suceso suprimido. Este método sólo es válido para notificaciones de sucesos suprimidos.
    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) {
          // procesar el nuevo suceso
          // ...
        }
      }
    
      else if(notifType == NotificationHelper.UPDATE_EVENT_NOTIFICATION_TYPE)
      {
        CommonBaseEvent event = notifications[i].getEvent();
        if (event != null) {
          // procesar el suceso actualizado
          // ...
        }
      }
    
      else if(notifType == NotificationHelper.REMOVE_EVENT_NOTIFICATION_TYPE)
      {
        String eventId = notifications.[i].getGlobalInstanceId();
        // procesar la supresión del suceso
        // ...
      }
    }

Condiciones de uso |


(c) Copyright IBM Corporation 2005, 2006.
Este centro de información está basado en tecnología Eclipse (http://www.eclipse.org)