Un event consumer può essere creato anche utilizzando un bean non basato sui messaggi.
// Richiamare una produzione helper di notifica da JNDI InitialContext context = new InitialContext(); Object notificationHelperFactoryObject = context.lookup("com/ibm/events/NotificationHelperFactory"); NotificationHelperFactory nhFactory = (NotificationHelperFactory) PortableRemoteObject.narrow(notificationHelperFactoryObject, NotificationHelperFactory.class); // Creare l'helper di notifica NotificationHelper notificationHelper = nhFactory.getNotificationHelper();
notificationHelper.setEventSelector("CommonBaseEvent[@severity > 30]");
È possibile associare ciascun gruppo eventi ad un unico argomento JMS e ad un qualsiasi numero di code JMS. È possibile interrogare l'helper di notifica per individuare quali destinazioni vengono associate ad un determinato gruppo eventi.
Per individuare l'argomento associato ad un gruppo eventi, utilizzare il metodo getJmsTopic(String) di NotificationHelper, specificando il nome del gruppo eventi:MessagePort msgPort = notificationHelper.getJmsTopic("critical_events");Per individuare le code associate ad un gruppo eventi, utilizzare il metodo getJmsQueues(String):
MessagePort[] msgPorts = notificationHelper.getJmsQueues("critical_events");L'oggetto restituito è un oggetto MessagePort singolo che rappresenta un argomento JMS o una matrice degli oggetti MessagePort che rappresentano le code JMS. Un'istanza MessagePort è un oggetto wrapper che contiene i nomi JNDI della destinazione e la propria produzione connessione.
String connectionFactoryName = msgPort.getConnectionFactoryJndiName(); String destinationName = msgPort.getDestinationJndiName(); // creare connessione e sessione ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup(connectionFactoryName); Connection connection = connectionFactory.createConnection(); Session session = connection.createSesion(false, Session.CLIENT_ACKNOWLEDGE); // Creare consumer e registrare listener Topic topic = (Topic) context.lookup(destinationName); MessageConsumer consumer = session.createConsumer(topic); consumer.setMessageListener(this); connection.start();
Nel metodo onMessage() del listener, utilizzare l'helper di notifica per convertire ogni messaggio JMS ricevuto in una array contenente una notifica di evento. (Se l'evento non corrisponde al selettore eventi specificato nell'helper di notifica, la array è vuota). Una notifica di evento è un'istanza di una classe che implementa l'interfaccia EventNotification.
public void onMessage(Message msg) { EventNotification[] notifications = notificationHelper.getEventNotifications(msg); // ...
Tipo di notifica | Descrizione |
---|---|
CREATE_EVENT _NOTIFICATION_TYPE |
Un nuovo evento è stato creato nel gruppo eventi associato alla destinazione. Questo significa che un nuovo evento è stato inviato oppure che un evento esistente è stato modificato in modo tale che ora corrisponda alla definizione di gruppo eventi. La notifica contiene anche i dati di evento completi. |
REMOVE_EVENT _NOTIFICATION_TYPE |
Un evento memorizzato nel database eventi è stato rimosso dal gruppo eventi associato alla destinazione. Questo significa che un evento è stato eliminato dal database eventi oppure che un evento esistente è stato modificato in modo tale da non corrispondere più alla definizione di gruppo eventi. La notifica contiene anche l'identificativo dell'istanza globale dell'evento eliminato. |
UPDATE_EVENT _NOTIFICATION_TYPE |
Un evento memorizzato nel database eventi è stato aggiornato in un modo che non ne modifica l'appartenenza nel gruppo eventi associato alla destinazione. La notifica contiene anche i dati di evento completi. |
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) { // elaborare il nuovo evento // ... } } else if(notifType == NotificationHelper.UPDATE_EVENT_NOTIFICATION_TYPE) { CommonBaseEvent event = notifications[i].getEvent(); if (event != null) { // elaborare l'evento aggiornato // ... } } else if(notifType == NotificationHelper.REMOVE_EVENT_NOTIFICATION_TYPE) { String eventId = notifications.[i].getGlobalInstanceId(); // elaborare eliminazione evento // ... } }