오브젝트 공고와 함께 구성 관리자 프록시를 사용한 브로커 도메인 관리의 결과 점검

이 작업은 구성 관리자 프록시(CMP) 응용프로그램을 개발하는 더 큰 작업의 일부입니다.

명령이 완료되거나 관리 오브젝트가 변경될 때마다 응용프로그램에 알릴 수 있습니다. OBSERVER 설계 패턴을 사용하면 오브젝트가 수정, 삭제되거나 앞서 전송된 조치의 응답이 구성 관리자에서 리턴될 때마다 특정 메소드가 호출되는 사용자 제공 오브젝트로 핸들링되는 CMP를 제공할 수 있습니다.

사용자 제공 코드가 AdministeredObjectListener 인터페이스를 구현해야 합니다. 이는 리스너가 등록되는 관리 오브젝트에서 이벤트가 발생할 때 CMP에서 호출하는 메소드를 정의합니다. 이 메소드는 다음과 같습니다.
  • processModify(…)
  • processDelete(…)
  • processActionResponse(…)
processModify(…)는 리스너가 등록되는 관리 오브젝트의 속성 중 하나 이상이 구성 관리자에 의해 수정될 때마다 호출됩니다. processModify() 메소드 인수 사용을 통해 이 공고에서 제공되는 정보는 다음과 같습니다.
  1. 공고가 참조하는 AdministeredObject의 핸들.
  2. 변경된 키 이름을 포함하는 문자열 목록.
  3. 브로커의 오브젝트(예: 새 실행 그룹)에 대해 작성된 새 하위 구성요소를 설명하는 문자열 목록.
  4. 오브젝트에 대해 제거된 하위 구성요소를 설명하는 문자열 목록.
최종 두 매개변수로 전달되는 문자열 형식은 관리 오브젝트의 내부 표현입니다. getSubcomponentFromString() 메소드를 사용하여 이 표현을 관리 오브젝트 유형으로 변경할 수 있습니다.
주:
  1. 성능이 향상되도록 이 목록 내에서 문자열이 전달됩니다. 호출 응용프로그램에서 특별히 요청하지 않은 경우 CMP가 관리 오브젝트를 인스턴스화하는 자원을 사용하지 않습니다.
  2. 응용프로그램이 배치 메소드를 사용하거나 CMP에 구성 관리자와의 통신 문제가 발생한 경우 리스너에 대해 processModify() 메소드를 처음 호출할 때 changed attributes 매개변수에 오브젝트의 전체 속성 이름 세트가 포함될 수 있습니다.

processDelete(…)는 리스너가 등록된 오브젝트가 구성 관리자에서 완전히 제거될 경우에 호출됩니다. 매개변수 하나가 processDelete(…)로 제공됩니다(삭제된 관리 오브젝트의 핸들). 이 메소드가 리턴되면 관리 오브젝트 핸들이 더 이상 올바르지 않을 수 있습니다. processDelete(…) 이벤트 발생 시점과 거의 동시에 processModify(…) 이벤트가 삭제된 오브젝트의 상위 리스너로 송신되어 하위 구성요소의 상위 목록 변경이 통보됩니다.

processActionResponse(…)는 응용프로그램이 전송한 이전 조치가 완료됨을 해당 응용프로그램에 알려주는 이벤트이며 하나의 processActionResponse(…) 이벤트만이 CMP 응용프로그램에서 실행한 각 상태 변경 조작에 수신됩니다. 다음 정보가 이 이벤트에 제공됩니다.
  1. 요청이 전송된 관리 오브젝트의 핸들.
  2. 요청 완료 코드.
  3. 결과와 연관된 0 또는 그 이상의 정보(BIP) 메시지 세트.
  4. 전송된 요청을 자세히 설명하는 (key, value) 쌍 세트.
최종 매개변수의 쌍 구문 분석에 대한 정보는 구성 관리자 프록시 API Reference를 참조하십시오.

리스너가 등록되도록 관리 오브젝트에서 이벤트가 발생할 때마다 제공된 코드를 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() 메소드가 호출됩니다. 여기에서 각 공고의 세부사항이 화면에 표시됩니다.

공고 수신 정지에는 세 가지 방법이 있습니다.
  • AdministeredObject.deregisterListener(AdministeredObjectListener)
  • ConfigManagerProxy.deregisterListeners()
  • ConfigManagerProxy.disconnect()
첫 번째 메소드는 단일 관리 오브젝트에서 단일 리스너를 등록 취소하며 다른 두 메소드는 ConfigManagerProxy 인스턴스와 연결된 모든 리스너를 등록 취소합니다. 또한 최종 메소드는 구성 관리자와 연결이 정지될 때 모든 리스너가 내재적으로 제거된다고 표시합니다.
주: 또한 AdvancedAdministeredObjectListener 인터페이스를 구현할 수 있는데, 등록 시 추가 정보가 응용프로그램에 제공됩니다.
관련 태스크
구성 관리자 프록시를 사용한 도메인 관리의 결과 점검
리턴 코드와 함께 구성 관리자 프록시를 사용한 도메인 관리의 결과 점검
최종 완료 코드와 함께 구성 관리자 프록시를 사용한 브로커 도메인 관리의 결과 점검
주의사항 | 등록상표 | 다운로드 | 라이브러리 | 지원 | 피드백
Copyright IBM Corporation 1999, 2006 마지막 갱신 날짜: 2006/08/21
ae33090_