オブジェクトの通知を使用して、ご使用のアプリケーションがオブジェクトに対して行った要求の結果を判別します。
CMP は、コマンドが完了したとき、または管理対象オブジェクトが変更されたときには、そのたびにアプリケーションに通知することができます。 OBSERVER 設計パターンを使用することにより、ご使用の CMP アプリケーションは、オブジェクトが変更または削除される場合や、以前に実行依頼されたアクションに対する応答がブローカーから戻されるときには、特定のメソッドが呼び出されているユーザー提供オブジェクトに対するハンドルを定義することができます。
ユーザー提供コードは AdministeredObjectListener インターフェースをインプリメントしなければなりません。 このインターフェースは、リスナーが登録されている管理対象オブジェクトでイベントが発生するときに、CMP によって呼び出されるメソッドを定義します。 以下のメソッドが定義済みです。
最後の 2 つのパラメーターに渡されるストリングのフォーマットは、管理対象オブジェクトの内部表記です。 getManagedSubcomponentFromStringRepresentation() メソッドを使用して、この表記を管理対象オブジェクト・タイプに変えることができます。
次の追加情報をご覧ください。
リスナーが登録されているオブジェクトがブローカーから完全に除去される場合に、processDelete(…) が呼び出されます。 processDelete(…) には 1 つのパラメーター、すなわち削除された管理対象オブジェクトへのハンドルが提供されます。このメソッドが戻されると、管理対象オブジェクト・ハンドルは有効ではなくなります。 processDelete(…) イベントの発生と同時期に、削除されたオブジェクトの親のリスナーに processModify(…) イベントが送信され、サブコンポーネントの親のリストで変更が通知されます。
レジスターを登録するために、各管理対象オブジェクトに registerListener() メソッドがあります。これは、そのオブジェクトに対するイベントが発生するたびに、提供されたコードを呼び出すように CMP に指示するために使用されます。 複数の管理対象オブジェクトからの通知の場合は、同じ AdministeredObjectListener を登録することができます。 また、同じ管理対象オブジェクトに対して複数の AdministeredObjectListeners を登録することもできます。
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) {
// 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) {
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();
}
}
}
listenForChanges() メソッドは、ブローカー変更を通知するために、MonitorBroker クラスのインスタンスを登録しようとします。 成功すれば、メイン・スレッドは、メソッドが戻されるときにアプリケーションが終了しないように、無制限に休止します。 リスナーが登録されると、ブローカーが変更されるときには (例えば、実行グループが追加される場合)、processModify() メソッドが呼び出されます。 このメソッドにより、各通知の詳細が画面に表示されます。
通知を受け取りたい各管理オブジェクトに対して、個別のリスナーを登録する必要があります。 同じリスナー・インスタンスを複数の管理対象オブジェクトに使用することができます。
最初のメソッドは、単一の管理対象オブジェクトから単一のリスナーを登録解除します。その他の 2 つのメソッドは、BrokerProxy インスタンスと接続されているすべてのリスナーを登録解除します。 さらに、最後のメソッドは、ブローカーへの接続が停止されると、すべてのリスナーが暗黙的に削除されることを示します。
また、AdvancedAdministeredObjectListener インターフェースをインプリメントすることもできます。これが登録されていると、アプリケーションに追加情報を提供します。