Isto faz parte da tarefa maior de desenvolver aplicativos do Configuration Manager Proxy (CMP).
É possível notificar aplicativos sempre que os comandos são concluídos ou sempre que ocorrem alterações em objetos administrados. Utilizando o padrão de design OBSERVER, é possível fornecer ao CMP uma manipulação para um objeto fornecido pelo usuário que tenha um método específico chamado se um objeto for modificado, excluído ou sempre que uma resposta a uma ação enviada anteriormente for retornada do Gerenciador de Configuração.
processDelete(…) será chamado se o objeto no qual o listener está registrado for totalmente removido do Gerenciador de Configuração. Fornecido para processDelete(…) é um parâmetro – uma manipulação do objeto administrado que foi excluído; quando este método for retornado, a manipulação do objeto administrado não será mais válida. Quase ao mesmo tempo que um evento processDelete(…) ocorre, é enviado um evento processModify(…) para os listeners do pai do objeto excluído, para anunciar uma alteração na lista de subcomponentes do pai.
Para registrar um listener, cada objeto administrado tem um método registerListener() utilizado para instruir o CMP a chamar o código fornecido sempre que ocorrer um evento nesse objeto. É possível registrar o mesmo AdministeredObjectListener para notificações de vários objetos administrados. Além disso, é possível registrar vários AdministeredObjectListeners no mesmo objeto administrado.
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) { // o encadeamento pode fazer algo mais aqui em vez de try { Thread.sleep(10000); } catch (InterruptedException ex) { // ignorar } } } } catch(ConfigManagerProxyPropertyNotInitializedException ex) { System.err.println("Comms problem! "+ex); } } public void processActionResponse(AdministeredObject obj, CompletionCodeType cc, List bipMessages, Properties refProperties) { // Evento ignorado neste exemplo } public void processDelete(AdministeredObject deletedObject) { // Evento ignorado neste exemplo } 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); } } }
O método listenForChanges() tenta registrar uma instância da classe MonitorTopology para notificações de alterações na topologia. Se for bem-sucedido, o encadeamento principal será pausado indefinidamente para evitar que o aplicativo seja encerrado quando o método for retornado. Quando o listener for registrado, sempre que a topologia for alterada - por exemplo, se for incluído um intermediário - o método processModify() será chamado. Isto exibe detalhes de cada notificação na tela.