Un consumidor de sucesos también puede crearse con un bean no controlado por mensajes.
// Obtener 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 ayuda de notificación NotificationHelper notificationHelper = nhFactory.getNotificationHelper();
notificationHelper.setEventSelector("CommonBaseEvent[@severity > 30]");
Cada grupo de sucesos puede asociarse a un tema JMS y cualquier cantidad de colas JMS. Puede consultar la ayuda de notificación para determinar qué destinos están asociados a un grupo de sucesos concreto.
Para determinar el tema asociado a un grupo de sucesos, utilice el método getJmsTopic(serie) de NotificationHelper y especifique el nombre del grupo de sucesos:MessagePort msgPort = notificationHelper.getJmsTopic("sucesos_graves");Para determinar las colas asociadas a un grupo de sucesos, utilice el método getJmsQueues(serie):
MessagePort[] msgPorts = notificationHelper.getJmsQueues("sucesos_graves");El objeto devuelto es un objeto MessagePort que representa un tema JMS o una matriz de objetos MessagePort que representan colas JMS. Una instancia de MessagePort es un objeto derivador que contiene los nombres JNDI del destino y su fábrica de conexiones.
String connectionFactoryName = msgPort.getConnectionFactoryJndiName(); String destinationName = msgPort.getDestinationJndiName(); // crear conexión y sesión ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup(connectionFactoryName); Connection connection = connectionFactory.createConnection(); Session session = connection.createSesion(false, Session.CLIENT_ACKNOWLEDGE); // crear consumidor y registrar escucha Topic topic = (Topic) context.lookup(destinationName); MessageConsumer consumer = session.createConsumer(topic); consumer.setMessageListener(this); connection.start();
En el método onMessage() de su dispositivo de escucha, utilice la ayuda de notificación para convertir cada mensaje JMS recibido en una matriz que contenga una notificación de suceso. (Si el suceso no coincide con el selector de sucesos especificado en la ayuda de notificación, la matriz estará 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); // ...
Tipo de notificación | Descripción |
---|---|
CREATE_EVENT _NOTIFICATION_TYPE |
Se ha creado un nuevo suceso en el grupo de sucesos asociado al destino. Esto significa que se ha enviado un nuevo suceso o que un suceso existente ha cambiado de modo que ahora coincide con la definición del grupo de sucesos. La notificación también contiene datos completos sobre el suceso. |
REMOVE_EVENT _NOTIFICATION_TYPE |
Un suceso almacenado en la base de datos de sucesos se ha eliminado del grupo de sucesos asociado al destino. Esto significa que se ha suprimido un suceso de la base de datos de sucesos o que un suceso existente ha cambiado de modo que ya no coincide con la definición del grupo de sucesos. La notificación también contiene el identificador de instancia global del suceso suprimido. |
UPDATE_EVENT _NOTIFICATION_TYPE |
Un suceso almacenado en la base de datos de sucesos se ha actualizado de modo que no cambia su pertenencia al grupo de sucesos asociado al destino. La notificación también contiene datos completos sobre el suceso. |
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 // ... } }