これは、構成マネージャー・プロキシー (CMP) アプリケーションの開発という、より大きなタスクの一部です。
コマンドが完了したとき、または管理対象オブジェクトが変更されたときには、そのたびにアプリケーションに通知することができます。 OBSERVER 設計パターンを使用することにより、オブジェクトが変更または削除される場合や、以前に実行依頼されたアクションに対する応答が構成マネージャーから戻されるときには、特定のメソッドが呼び出されているユーザー提供オブジェクトに対するハンドルを CMP に提供することができます。
リスナーが登録されているオブジェクトが構成マネージャーから完全に除去される場合に、processDelete(…) が呼び出されます。 processDelete(…) には 1 つのパラメーター、すなわち削除された管理対象オブジェクトへのハンドルが提供されます。このメソッドが戻されると、管理対象オブジェクト・ハンドルは有効ではなくなります。processDelete(…) イベントの発生と同時期に、削除されたオブジェクトの親のリスナーに processModify(…) イベントが送信され、サブコンポーネントの親のリストで変更が通知されます。
レジスターを登録するために、各管理対象オブジェクトに registerListener() メソッドがあります。これは、そのオブジェクトに対するイベントが発生するたびに、提供されたコードを呼び出すように CMP に指示するために使用されます。 複数の管理対象オブジェクトからの通知の場合は、同じ AdministeredObjectListener を登録することができます。 さらに、同じ管理対象オブジェクトに対して複数の AdministeredObjectListeners を登録することができます。
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); } } }
listenForChanges() メソッドは、トポロジー変更を通知するために、MonitorTopology クラスのインスタンスを登録しようとします。 成功すれば、メイン・スレッドは、メソッドが戻されるときにアプリケーションが終了しないように、無制限に休止します。 リスナーが登録されると、トポロジーが変更されるときには (例えば、ブローカーが追加される場合)、processModify() メソッドが呼び出されます。 これにより、各通知の詳細が画面に表示されます。