Esto forma parte de la tarea global para el desarrollo de las aplicaciones del Proxy del Gestor de configuración (CMP).
Se puede enviar una notificación a las aplicaciones cada vez que finalice un mandato o siempre que se produzcan cambios en objetos administrados. Utilizando el patrón de diseño OBSERVER, se puede suministrar al CMP un manejador para un objeto suministrado por el usuario que haya invocado un objeto específico si un objeto se modifica o suprime o siempre que se devuelve una respuesta a una acción sometida anteriormente desde el Gestor de configuración.
processDelete(…) se invoca si el objeto con el que está registrado el escucha se elimina totalmente del Gestor de configuración. Suministrado para processDelete(…) existe un parámetro – un manejador para el objeto administrado que se ha suprimido; cuando el método vuelva, es posible que que manejador del objeto administrado ya no sea válido. Más o menos al mismo tiempo que se produce un suceso processDelete(…), se envía un suceso processModify(…) a los escuchas del padre del objeto suprimido para anunciar un cambio en la lista de subcomponentes del padre.
Para registrar un escucha, cada objeto administrado tiene un método registerListener() que se utiliza para indicar al CMP que llame al código suministrado siempre que se produzca un suceso en dicho objeto. Es posible registrar el mismo AdministeredObjectListener para las notificaciones de múltiples objetos administrados. Además, es posible registrar varios AdministeredObjectListeners para el mismo objeto administrado.
import com.ibm.broker.config.proxy.*; import com.ibm.broker.config.common.CompletionCodeType; import java.util.List; import java.util.ListIterator; import java.util.Properties; public class MonitorTopology implements AdministeredObjectListener { public static void main(String[] args) { ConfigManagerProxy cmp = null; try { ConfigManagerConnectionParameters cmcp = new MQConfigManagerConnectionParameters( "localhost", 1414, ""); cmp = ConfigManagerProxy.getInstance(cmcp); } catch (ConfigManagerProxyException cmpex) { System.out.println("Error connecting: "+cmpex); } if (cmp != null) { System.out.println("Connected to Config Manager!"); TopologyProxy topology = cmp.getTopology(); listenForChanges(topology); cmp.disconnect(); } } private static void listenForChanges(AdministeredObject obj) { try { if (obj != null) { obj.registerListener(new MonitorTopology()); while(true) { // la hebra podría hacer algo distinto aquí try { Thread.sleep(10000); } catch (InterruptedException ex) { // ignorar } } } } catch(ConfigManagerProxyPropertyNotInitializedException ex) { System.err.println("Comms problem! "+ex); } } public void processActionResponse(AdministeredObject obj, CompletionCodeType cc, List bipMessages, Properties refProperties) { // Suceso ignorado en este ejemplo } public void processDelete(AdministeredObject deletedObject) { // Suceso ignorado en este ejemplo } public void processModify(AdministeredObject affectedObject, List changedAttributes, List newChildren, List removedChildren) { System.out.println(affectedObject+" has changed:"); ListIterator e = changedAttributes.listIterator(); while (e.hasNext()) { String changedAttribute = (String) e.next(); System.out.println("Changed: "+changedAttribute); } ListIterator e2 = newChildren.listIterator(); while (e2.hasNext()) { String newChildStr = (String) e2.next(); AdministeredObject newChild = affectedObject.getSubcomponentFromString(newChildStr); System.out.println("New child: "+newChild); } ListIterator e3 = removedChildren.listIterator(); while (e3.hasNext()) { String remChildStr = (String) e3.next(); AdministeredObject removedChild = affectedObject.getSubcomponentFromString(remChildStr); System.out.println("Removed child: "+removedChild); } } }
El método listenForChanges() intenta registrar una instancia de la clase MonitorTopology para las notificaciones de cambios en la topología. Si la operación es satisfactoria, la hebra principal queda en pausa indefinidamente para impedir que la aplicación salga cuando el método vuelva. Cuando el escucha está registrado, siempre que la topología cambia - por ejemplo si se añade una intermediario - se llama al método processModify(). Esto visualiza en la pantalla detalles de cada notificación.