Questa sezione fa parte dell'attività più ampia di sviluppo delle applicazioni CMP (Configuration Manager Proxy/Proxy di Gestione configurazione).
E' possibile inviare una notifica alle applicazioni ogni volta che i comandi vengono completati oppure ogni volta che vengono apportate modifiche agli oggetti gestiti. Utilizzando il modello di progettazione OBSERVER, è possibile fornire a CMP un handle per un oggetto fornito dall'utente in cui viene richiamato un metodo specifico se un oggetto viene modificato o eliminato oppure ogni volta che Gestione configurazione restituisce una risposta ad un'azione precedentemente inoltrata.
processDelete(…) viene richiamato se l'oggetto con cui il listener è registrato viene completamente rimosso da Gestione configurazione. A processDelete(…) viene fornito un parametro - un handle per l'oggetto gestito eliminato; una volta ritornato tale metodo, l'handle dell'oggetto gestito potrebbe non essere più valido. Circa nello stesso momento in cui si verifica un evento processDelete(…), viene inviato un evento processModify(…) ai listener dell'oggetto principale dell'oggetto eliminato, per indicare una modifica nell'elenco dei componenti secondari del componente principale.
Per registrare un listener, ciascun oggetto gestito ha un metodo registerListener() utilizzato per indicare a CMP di richiamare il codice fornito ogni volta che si verifica un evento su tale oggetto. E' possibile registrare lo stesso AdministeredObjectListener per le notifiche da più oggetti gestiti. Inoltre, è possibile registrare più AdministeredObjectListeners sullo stesso oggetto gestito.
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) { // thread could do something else here instead try { Thread.sleep(10000); } catch (InterruptedException ex) { // ignore } } } } catch(ConfigManagerProxyPropertyNotInitializedException ex) { System.err.println("Comms problem! "+ex); } } public void processActionResponse(AdministeredObject obj, CompletionCodeType cc, List bipMessages, Properties refProperties) { // Event ignored in this example } public void processDelete(AdministeredObject deletedObject) { // Event ignored in this example } 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); } } }
Il metodo listenForChanges() prova a registrare un'istanza della classe MonitorTopology per le notifiche delle modifiche alla topologia. In caso di esito positivo, il thread principale si arresta per un periodo indefinito per impedire all'applicazione di uscire una volta ritornato il metodo. Una volta registrato il listener, ogni volta che viene modificata la topologia - ad esempio, se viene aggiunto un broker - viene richiamato il metodo processModify(). Vengono visualizzati i dettagli di ciascuna notifica.