Ermitteln Sie mithilfe der Objektbenachrichtigung das Ergebnis einer Anforderung, die von Ihrer Anwendung an das Objekt gestellt wurde.
Der Konfigurationsmanager-Proxy kann Anwendungen benachrichtigen, wenn Befehle ausgeführt oder Änderungen an verwalteten Objekten vorgenommen wurden. Mithilfe des Entwurfsmusters OBSERVER kann Ihre Konfigurationsmanager-Proxy-Anwendung eine Kennung für ein benutzerdefiniertes Objekt definieren, über die eine bestimmte Methode aufgerufen wird, wenn ein Objekt geändert, gelöscht bzw. eine Antwort zu einer zuvor übergebenen Aktion vom Broker zurückgegeben wird.
Der benutzerdefinierte Code muss die Schnittstelle AdministeredObjectListener implementieren. Sie definiert Methoden, die vom Konfigurationsmanager-Proxy aufgerufen werden, wenn ein Ereignis in einem verwalteten Objekt, für das das Empfangsprogramm registriert wurde, auftritt. Die folgenden Methoden werden definiert:
Beim Format der Zeichenfolgen, die an die zwei letzten Parameter übergeben werden, handelt es sich um eine interne Darstellung des verwalteten Objekts. Sie können diese Darstellung unter Verwendung der Methode getManagedSubcomponentFromStringRepresentation() in den Typ eines verwalteten Objekts ändern.
Lesen Sie die folgenden zusätzlichen Informationen:
processDelete(…) wird aufgerufen, wenn das Objekt, für das das Empfangsprogramm registriert wurde, aus dem Broker 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 Konfigurationsmanager-Proxy 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.proxy.CompletionCodeType;
import java.util.List;
import java.util.ListIterator;
import java.util.Properties;
public class MonitorBroker implements AdministeredObjectListener {
public static void main(String[] args) {
BrokerProxy b = null;
try {
BrokerConnectionParameters bcp =
new MQBrokerConnectionParameters(
"localhost",
1414,
"");
b = BrokerProxy.getInstance(bcp);
} catch (ConfigManagerProxyException cmpex) {
System.out.println("Error connecting: "+cmpex);
}
if (b != null) {
System.out.println("Connected to broker");
listenForChanges(b);
b.disconnect();
}
}
private static void listenForChanges(AdministeredObject obj)
{
if (obj != null) {
obj.registerListener(new MonitorBroker());
while(true) {
// thread could do something else here instead
try {
Thread.sleep(10000);
} catch (InterruptedException ex) {
// ignore
}
}
}
}
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) {
try {
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.getManagedSubcomponentFromStringRepresentation(newChildStr);
System.out.println("New child: "+newChild);
}
ListIterator e3 = removedChildren.listIterator();
while (e3.hasNext()) {
String remChildStr = (String) e3.next();
AdministeredObject removedChild =
affectedObject.getManagedSubcomponentFromStringRepresentation(remChildStr);
System.out.println("Removed child: "+removedChild);
}
} catch (ConfigManagerProxyPropertyNotInitializedException ex) {
ex.printStackTrace();
}
}
}
Die Methode listenForChanges() registriert eine Instanz der Klasse MonitorBroker für Benachrichtigungen über Brokerä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 des Brokers (z. B. wenn eine Ausführungsgruppe hinzugefügt wird) die Methode processModify() aufgerufen. Die Details der jeweiligen Benachrichtigung werden am Bildschirm angezeigt.
Sie müssen für jedes verwaltete Objekt, bei dem Sie Benachrichtigungen wünschen, separate Empfangsprogramme registrieren. Dieselbe Empfangsprogramminstanz kann für mehrere verwaltete Objekte verwendet werden.
Die erste Methode nimmt die Registrierung eines Empfangsprogramms für ein verwaltetes Objekt zurück; mit den anderen zwei Methoden wird die Registrierung aller Empfangsprogramme, die mit der BrokerProxy-Instanz verbunden sind, aufgehoben. Außerdem zeigt die letzte Methode an, dass alle Empfangsprogramme implizit entfernt werden, wenn die Verbindung zum Broker gestoppt wird.
Sie können auch die Schnittstelle AdvancedAdministeredObjectListener implementieren, die zusätzliche Informationen an Anwendungen weitergibt.