Un consumidor de sucesos J2EE se implementa como bean controlado por
mensajes, que se asocia a un destino JMS y a una fábrica de conexiones en tiempo de
despliegue. Para recibir sucesos, siga estos pasos:
Pasos para realizar esta tarea
- Obtenga una ayuda de notificación. Un consumidor de sucesos
JMS utiliza una ayuda de notificación para identificar destinos JMS asociados a
un grupo de sucesos, para convertir mensajes JMS recibidos en notificaciones de
sucesos y para realizar el filtrado de sucesos recibidos. Para obtener una ayuda de
notificación, utilice la fábrica de ayudas de notificación, que es una instancia de
NotificationHelperFactory enlazada a un espacio de nombres JNDI. En
el fragmento de código siguiente se usa una fábrica de ayudas de notificación
para obtener una ayuda de notificación.
// 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();
- Opcional: Especifique el selector de sucesos. Si
desea filtrar los sucesos recibidos, puede usar el método setEventSelector() para
establecer un selector de sucesos en la ayuda de notificación. Su consumidor de
sucesos puede usar la ayuda de notificación para comprobar sucesos recibidos en
relación con el selector de sucesos. En el fragmento de código
siguiente se establece un selector de sucesos que especifica sucesos con una
gravedad superior a 30 (aviso).
notificationHelper.setEventSelector("CommonBaseEvent[@severity > 30]");
- Convierta los mensajes recibidos en notificaciones de mensajes.
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);
// ...
- Compruebe el tipo de notificación y recupere los datos de sucesos que
convenga. Cada notificación de suceso posee 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 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 los 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. |
Utilice el método getNotificationType() de EventNotification para
comprobar el tipo de notificación de cada notificación recibida. En función del tipo
de notificación, puede determinar si el consumidor de sucesos debe realizar
algún proceso adicional de la notificación y qué tipo de datos del suceso contiene la notificación:
- Si el tipo de notificación es CREATE_EVENT_NOTIFICATION_TYPE o UPDATE_EVENT_NOTIFICATION_TYPE,
su consumidor puede usar 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, su consumidor puede usar
EventNotification.getGlobalInstanceId() para obtener 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é hacer a continuación
En su descriptor de despliegue, un bean controlado por mensajes debe
asociarse a un puerto de escucha, que especifica un destino JMS y una fábrica de
conexiones. Debe crear un puerto de escucha para su consumidor de sucesos antes de
desplegar el MDB, de forma que especifique 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 de escucha
CommonEventInfrastructure_ListenerPort cuando despliegue el MDB. El servidor de
sucesos utiliza este puerto de escucha y no está destinado a que lo utilicen los
consumidores de sucesos.