Dies ist eine der Tasks, die in Zusammenhang mit der Entwicklung Ihrer Konfigurationsmanager-Proxy-Anwendungen ausgeführt werden.
Sie haben die Möglichkeit, Anwendungen zu benachrichtigen, wenn Befehle ausgeführt oder Änderungen an verwalteten Objekten vorgenommen wurden. Mit Hilfe des Entwurfsmusters OBSERVER kann eine Kennung für ein benutzerdefiniertes Objekt an den CMP übergeben werden, über die eine bestimmte Methode aufgerufen wird, wenn ein Objekt geändert, gelöscht bzw. eine Antwort zu einer zuvor übergebenen Aktion vom Konfigurationsmanager zurückgegeben wird.
processDelete(…) wird aufgerufen, wenn das Objekt, für das das Empfangsprogramm registriert wurde, aus dem Konfigurationsmanager vollständig entfernt wird. An die Methode processDelete(…) wird ein Parameter übergeben – eine Kennung für das verwaltete Objekt, das gelöscht wurde; wenn diese Methode fertig wurde, ist die Kennung des verwalteten Objekt möglicherweise ungültig. Fast zeitgleich mit dem Ereignis processDelete(…) wird das Ereignis processModify(…) an Empfangsprogramme des übergeordneten Elements des gelöschten Objekts gesendet, um eine Änderung in der Liste der Subkomponenten des übergeordneten Elements anzuzeigen.
Für die Registrierung eines Empfangsprogramms steht jedem verwalteten Objekt eine Methode zur Registrierung (registerListener()) zur Verfügung, die dazu verwendet wird, den CMP anzuweisen, den bereitgestellten Code aufzurufen, wenn ein Ereignis auf diesem Objekt ausgeführt wird. Für Benachrichtigungen von mehreren verwalteten Objekten kann dasselbe Empfangsprogramm für verwaltete Objekte registriert werden. Darüber hinaus können für ein verwaltetes Objekte mehrere Empfangsprogramme für verwaltete Objekte registriert werden.
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) { // Ereignis in diesem Beispiel ignoriert } public void processDelete(AdministeredObject deletedObject) { // Ereignis in diesem Beispiel ignoriert } 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); } } }
Die Methode listenForChanges() registriert eine Instanz der Klasse MonitorTopology für Benachrichtigungen über Topologieänderungen. Bei erfolgreicher Ausführung der Registrierung, wird der Hauptthread auf unbestimmte Zeit angehalten, um zu verhindern, dass die Anwendung beendet wird, wenn die Methode einen Wert zurückgibt. Wenn das Empfangsprogramm registriert wurde, wird bei jeder Änderung der Topologie (z. B. wenn ein Broker hinzugefügt wird) die Methode processModify() aufgerufen, und es werden die Details der jeweiligen Benachrichtigung am Bildschirm angezeigt.