Los consumidores de sucesos J2EE se implementan como beans controlados
por mensaje, que se asocian a destinos JMS y a fábricas de
conexiones durante el despliegue. Para recibir sucesos, siga estos
pasos:
Pasos para realizar esta tarea
- 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();
- 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]");
- 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);
// ...
- 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
// ...
}
}
Qué hay que hacer a continuación
En el descriptor de despliegue, un bean controlado por mensaje
debe estar asociado con un puerto receptor, que especifica un fábrica de
conexiones y un destino JMS. Debe crear un puerto receptor para el consumidor
de sucesos antes de desplegar el MDB (bean controlado por mensaje), especificando el destino y la fábrica
de conexiones asociada al grupo de sucesos del que desea recibir sucesos
(estos se definen en el perfil del grupo de sucesos)
Nota: No utilice el puerto receptor CommonEventInfrastructure_ListenerPort cuando despliegue el MDB.
Este puerto receptor lo utiliza el servidor de sucesos y no está pensado
para que lo utilicen los consumidores de sucesos.