구성 관리자 프록시를 사용한 브로커 도메인 탐색

시작하기 전에

이 단계를 시작하기 전에 구성 관리자 프록시를 사용하여 구성 관리자에 연결 단계를 완료해야 합니다.

구성 관리자에서 제어 가능한 각 도메인 오브젝트는 구성 관리자 프록시(CMP)에서 단일 오브젝트로 표시되며 다음이 포함됩니다.
  • 브로커
  • 실행 그룹
  • 전개된 메시지 플로우
  • 토픽
  • 집합
  • subscription
  • Publish/Subscribe 토폴로지
  • 브로커 이벤트 로그

전개된 실행 그룹의 속성으로 핸들링되더라도 CMP 또한 전개된 메시지 세트를 핸들링합니다.

통칭하여 관리 오브젝트라고 하는 이 오브젝트는 구성 관리자와의 많은 인터페이스 기능을 제공하므로 구성 관리자 프록시 API를 이해하는 데 기초가 됩니다.

각 관리 오브젝트는 구성 관리자의 기본 오브젝트 유형을 설명하는 Java 클래스의 인스턴스입니다. 가능한 Java 클래스는 다음과 같습니다.
Java 클래스 클래스 기능
TopologyProxy Pub/Sub 토폴로지를 설명합니다.
CollectiveProxy Pub/Sub 집합을 설명합니다.
BrokerProxy 브로커를 설명합니다.
ExecutionGroupProxy 실행 그룹을 설명합니다.
MessageFlowProxy 실행 그룹으로 이미 전개된 메시지 플로우를 설명하며 툴킷의 브로커 응용프로그램 개발 Perspective에서는 메시지 플로우를 설명하지 않습니다.
TopicProxy 토픽을 설명합니다.
TopicRootProxy 토픽 계층의 루트를 설명합니다.
LogProxy 현재 사용자의 브로커 이벤트 로그를 설명합니다.
SubscriptionsProxy 활성 Subscription의 서브세트를 설명합니다.
ConfigManagerProxy 구성 관리자 자체를 설명합니다.
각 관리 오브젝트는 구성 관리자에서 제어 가능한 단일 오브젝트를 설명합니다. 브로커 도메인 내의 모든 브로커의 경우 CMP 응용프로그램 등에서 브로커를 표시하는 하나의 BrokerProxy 인스턴스가 있습니다.

인스턴스가 참조하는 기본 구성 관리자 오브젝트의 등록 정보를 조회 및 조작하는 데 프로그램이 사용할 수 있는 공용 메소드 세트가 각 관리 오브젝트에 선언됩니다. 예를 들어, 브로커 B1을 참조하는 BrokerProxy 오브젝트에서 메소드를 호출하여 브로커가 실행 상태를 표시하거나 모든 메시지 플로우의 시작 등을 수행하게 할 수 있습니다.

관리 오브젝트에 액세스하고 API를 사용하려면 논리적으로 API를 소유한 오브젝트에서 API의 핸들을 우선 요청해야 합니다. 예를 들어, 브로커가 실행 그룹을 논리적으로 소유한 경우 브로커 B1에서 실행 중인 실행 그룹 EG1을 핸들링하려면 응용프로그램이 EG1에서 표시한 ExecutionGroupProxy 오브젝트를 핸들링하도록 B1에서 표시한 BrokerProxy 오브젝트를 요구해야 합니다.

ConnectToConfigManager 예에서는 ConfigManagerProxy 오브젝트가 핸들링됩니다. ConfigManagerProxy는 논리적으로 관리 오브젝트 트리의 루트인데, 이 위치에서 구성 관리자의 기타 모든 오브젝트에 직접 또는 간접적으로 액세스할 수 있음을 의미합니다. 구성 관리자가 Publish/Subscribe 토폴로지를 직접 소유하기 때문에 TopologyProxy 오브젝트가 핸들링되도록 응용프로그램이 ConfigManagerProxy에서 호출할 수 있는 메소드가 있습니다. 유사하게 토폴로지에 모든 브로커 세트가 논리적으로 포함되어 있어 TopologyProxy 오브젝트에서 메소드를 호출하여 BrokerProxy 오브젝트에 액세스할 수 있습니다. 이 액세스 관계의 전체 계층이 아래에 표시되어 있습니다.
시작점으로 ConnectToConfigManager 예를 사용하는 경우 다음 프로그램이 관리 오브젝트 계층을 횡단하여 전개된 메시지 플로우의 실행 상태를 발견합니다. 코드에 있는 이 값을 도메인에 있는 올바른 값으로 대체할 수 있더라도 메시지 플로우 MF1이 브로커 B1EG1로 전개된다고 프로그램이 가정한다는 점에 유의하십시오.
import com.ibm.broker.config.proxy.*;

public class GetMessageFlowRunState {

  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!");
      displayMessageFlowRunState(cmp, "B1", "EG1", "MF1");
      cmp.disconnect();
    }      
  }

  private static void displayMessageFlowRunState(
                                 ConfigManagerProxy cmp,
                                 String brokerName,
                                 String egName,
                                 String flowName) {
    try {
      TopologyProxy topology = cmp.getTopology();
            
      if (topology != null) {
        BrokerProxy b = topology.getBrokerByName(brokerName);

        if (b != null) {
          ExecutionGroupProxy eg =
            b.getExecutionGroupByName(egName);

          if (eg != null) {
            MessageFlowProxy mf = 
              eg.getMessageFlowByName(flowName);

            if (mf != null) {
              boolean isRunning = mf.isRunning();
              System.out.print("Flow "+flowName+" on " + 
                egName+" on "+brokerName+" is ");

              if (isRunning) {
                System.out.println("running");
              } else {
                System.out.println("stopped");
              }
            } else {
              System.err.println("No such flow "+flowName);
            }
          } else {
            System.err.println("No such exegrp "+egName+"!");
          }
        } else {
          System.err.println("No such broker "+brokerName);
        }
      } else {
        System.err.println("Topology not available!");
      }
    } catch(ConfigManagerProxyPropertyNotInitializedException
                                                      ex) {
      System.err.println("Comms problem! "+ex);
    }
  }
}
displayMessageFlowRunState() 메소드가 작업 대부분을 수행합니다. 이 메소드는 앞서 핸들링된 올바른 ConfigManagerProxy를 사용하며 다음과 같이 메시지 플로우의 실행 상태를 발견합니다.
  1. ConfigManagerProxy 인스턴스는 TopologyProxy를 핸들링하는 데 사용합니다. 구성 관리자마다 토폴로지가 하나만 있기 때문에 getTopology() 메소드는 ID로 규정할 필요가 없습니다.
  2. 올바른 토폴로지가 리턴될 경우 TopologyProxy 인스턴스를 사용하여 이름이 문자열 brokerName으로 설명되는 BrokerProxy 오브젝트를 핸들링합니다.
  3. 올바른 브로커가 리턴될 경우 BrokerProxy 인스턴스를 사용하여 이름이 문자열 egName으로 설명되는 ExecutionGroupProxy 오브젝트를 핸들링합니다.
  4. 올바른 실행 그룹이 리턴될 경우 ExecutionGroupProxy 인스턴스를 사용하여 이름이 문자열 flowName으로 설명되는 MessageFlowProxy 오브젝트를 핸들링합니다.
  5. 올바른 메시지 플로우가 리턴될 경우 MessageFlowProxy 오브젝트의 실행 상태가 조회되고 결과가 표시됩니다.
조작할 오브젝트의 이름은 알 필요가 없습니다. 관리 오브젝트마다 논리적으로 소유한 오브젝트 세트를 리턴하는 메소드가 포함되어 있습니다. 다음 예에서는 도메인 내의 모든 브로커 이름을 찾아 설명합니다.
import java.util.Enumeration;
import com.ibm.broker.config.proxy.*;

public class DisplayBrokerNames {

  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!");
      displayBrokerNames(cmp);
      cmp.disconnect();
    }
  }

  private static void displayBrokerNames(ConfigManagerProxy cmp)
  {
    try {
      TopologyProxy topology = cmp.getTopology();
            
      if (topology != null) {
        Enumeration allBrokers = topology.getBrokers(null);
        
        while (allBrokers.hasMoreElements()) {
          BrokerProxy thisBroker =
            (BrokerProxy) allBrokers.nextElement();
          System.out.println("Broker "+thisBroker.getName());
        }
      }
    } catch(ConfigManagerProxyPropertyNotInitializedException
                                                      ex) {
        System.err.println("Comms problem! "+ex);
    }
  }
}
키 메소드는 TopologyProxy.getBrokers(Properties)입니다. 널(Null) 인수로 제공될 때 도메인의 모든 BrokerProxy 오브젝트 열거를 리턴합니다. 프로그램이 이 메소드를 사용하여 각 BrokerProxy를 차례로 찾아 이름을 표시합니다.

TopologyProxy.getBrokers(Properties)의 등록 정보 인수를 사용하여 찾은 브로커의 특성을 정확히 지정할 수 있습니다. 관리 오브젝트를 리턴하는 거의 모든 메소드에 대해 이를 수행할 수 있으며 프로그램에서 작업하는 데 필요한 오브젝트를 필터링하는 강력한 수단입니다.

오브젝트 찾기를 필터링하는 데 사용할 수 있는 특성의 예로 실행 상태 및 간단한 설명과 이름 및 UUID와 같은 보다 분명한 등록 정보가 있습니다. 논리를 기록하여 이를 수행하려면 각 관리 오브젝트가 정보를 저장하는 방법을 이해해야 합니다.

각 관리 오브젝트의 등록 정보는 해시 테이블 사용을 통해 오브젝트 내에 논리적으로 저장되며, 여기서 각 등록 정보는 {key, value} tuple로 표시됩니다. 각 키는 속성의 이름(예: name)이며 각 값은 값(예: BROKER1)이 됩니다.

각 키 이름은 AttributeConstants 클래스의 상수를 사용하여 표현해야 합니다(com.ibm.broker.config.proxy). 각 관리 오브젝트의 전체 키 및 가능한 값 세트는 AttributesConstant 클래스의 Java 문서에 설명되거나 구성 관리자 프록시 API 연습기 샘플 프로그램의 Show raw property table for this object 기능을 사용하여 설명합니다. 후자는 각 관리 오브젝트에 대해 {key, value} 쌍의 전체 목록을 표시합니다.

찾기 메소드에 제공되는 등록 정보 인수는 리턴된 나열의 각 관리 오브젝트에 존재해야 하는 {key, value} 쌍의 세트입니다. 이를 설명하도록 다음 코드 단편을 고려하십시오.
Properties p = new Properties();
        
p.setProperty(AttributeConstants.OBJECT_RUNSTATE_PROPERTY,
              AttributeConstants.OBJECT_RUNSTATE_RUNNING);

Enumeration e = executionGroup.getMessageFlows(p);
변수 executionGroup이 올바른 ExecutionGroupProxy 오브젝트인 경우 리턴된 나열에 실행 중인 메시지 플로우만이 포함됩니다(OBJECT_RUN_STATE_PROPERTY는 OBJECT_RUNSTATE_RUNNING과 동등).
오브젝트 나열보다 단일 관리 오브젝트를 리턴하는 메소드에 등록 정보 필터링이 적용될 경우 첫 번째 결과만 리턴됩니다(둘 이상의 일치가 적용되는 경우에는 결정적인 요소가 되지 않음). 의미는 다음과 같습니다.
Properties p = new Properties();

p.setProperty(AttributeConstants.NAME_PROPERTY,
              "shares");

TopicProxy t = topicProxy.getTopic(p);
위의 내용은 다음으로 대체합니다.
TopicProxy t = topicProxy.getTopicByName("shares");

여러 개의 {key, value} 쌍이 등록 정보 필터에 추가될 경우 오브젝트가 일치되도록 모든 등록 정보가 하위 오브젝트에 존재해야 합니다. 이를 수행하는 특정 응용프로그램 코드를 기록하지 않고서는 필터에서 논리 OR 또는 논리 NOT을 수행할 수 없습니다.

AdministeredObjects가 응용프로그램에서 처음 인스턴스화될 경우 CMP가 해당 오브젝트의 현재 등록 정보 세트를 구성 관리자에 요구합니다. 이는 비동기 방식으로 발생하는데, 등록 정보가 처음 요청될 경우 구성 관리자에서 정보를 제공할 때까지 CMP가 대기하는 동안 일시정지가 발생할 수 있음을 의미합니다. 특정 시간 내에 정보가 도착하지 않을 경우(예: 구성 관리자가 실행되지 않은 경우) ConfigManagerProxyPropertyNotInitializedException이 전달됩니다. CMP의 최대 대기 시간은 ConfigManagerProxy.setRetryCharacteristics() 메소드를 통해 판별됩니다.

관련 태스크
구성 관리자 프록시 응용프로그램 개발 및 실행을 위한 환경 구성
구성 관리자 프록시를 사용하여 구성 관리자에 연결
주의사항 | 등록상표 | 다운로드 | 라이브러리 | 지원 | 피드백
Copyright IBM Corporation 1999, 2006 마지막 갱신 날짜: 2006/08/21
ae33040_