이 작업은 구성 관리자 프록시(CMP) 응용프로그램을 개발하는 더 큰 작업의 일부입니다.
명령이 완료되거나 관리 오브젝트가 변경될 때마다 응용프로그램에 알릴 수 있습니다. OBSERVER 설계 패턴을 사용하면 오브젝트가 수정, 삭제되거나 앞서 전송된 조치의 응답이 구성 관리자에서 리턴될 때마다 특정 메소드가 호출되는 사용자 제공 오브젝트로 핸들링되는 CMP를 제공할 수 있습니다.
processDelete(…)는 리스너가 등록된 오브젝트가 구성 관리자에서 완전히 제거될 경우에 호출됩니다. 매개변수 하나가 processDelete(…)로 제공됩니다(삭제된 관리 오브젝트의 핸들). 이 메소드가 리턴되면 관리 오브젝트 핸들이 더 이상 올바르지 않을 수 있습니다. processDelete(…) 이벤트 발생 시점과 거의 동시에 processModify(…) 이벤트가 삭제된 오브젝트의 상위 리스너로 송신되어 하위 구성요소의 상위 목록 변경이 통보됩니다.
리스너가 등록되도록 관리 오브젝트에서 이벤트가 발생할 때마다 제공된 코드를 CMP가 호출하도록 하는 데 사용하는 registerListener() 메소드가 각 관리 오브젝트마다 있습니다. 여러 관리 오브젝트에서 공고에 대해 동일한 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() 메소드가 호출됩니다. 여기에서 각 공고의 세부사항이 화면에 표시됩니다.