JMX 연결기 - xrath.com 에서 번역됨

목차 | 전의 항목 | 다음의 항목 | Java Management Extensions (JMX) 테크놀러지의 튜토리얼

## 제 3 장

## JMX 연결기

이 장에서는, 표준 및 동적인 관리 Bean (MBean)의 개념을 소개합니다. 또, Java Management Extensions (JMX) 테크놀러지를 사용해 MBean 상에서 로컬 및 원격로부터 조작을 실행하는 방법에 대해 가리킵니다.

## 3.1 RMI 연결기를 사용한 표준 및 동적 MBeans 에의 액세스

이 예에서는, 표준 및 동적 MBeans 만을 설명합니다.

제 2 장 「JMX API 의 기본 요소」 로 설명한 것처럼, 표준 MBean 는 내부의 메소드의 이름을 사용해 관리 인터페이스를 정적으로 정의하는 관리 Bean 입니다. 동적 MBean 는, 특정의 Java 인터페이스를 구현해, 실행시에 스스로의 속성과 조작을 나타냅니다.

JMX 테크놀러지는, RMI 에 근거해 연결기를 정의합니다. RMI 연결기는, Java Remote Method Protocol (JRMP)와 Internet Inter-Object Request Broker (ORB) Protocol (IIOP)의 2 개의 표준 RMI 트랜스폴트를 지원하고 있습니다. 이 연결기를 사용하면(자), MBean 서버의 MBean 에 원격 접속해, 로컬로 조작을 실행하는 것과 완전히 똑같이, 그 MBean 로 조작을 실행할 수 있습니다.

이 예는, 표준 MBean 와 동적 MBean 의 구현을 설명하는 것을 목적으로 하고 있습니다. 또, 양 MBean 상에서 로컬에, 또 서버 원격 클라이언트간의 RMI 접속을 통해서 원격에 조작을 실행하는 방법도 가리킵니다.

이 예를 실행하는 경우

1. 서버측:

1. MBean 서버를 작성
2. 로컬 MBean 서버에 `SimpleStandard` 와 `SimpleDynamic` 의 MBean 를 등록
3. 양 MBean 상에서 로컬 조작을 실행
4. RMI 연결기 서버를 작성

2. 클라이언트측:

1. RMI 연결기를 작성
2. 원격 MBean 서버에 `SimpleStandard` 와 `SimpleDynamic` 의 MBean 를 등록
3. 양 MBean 로 원격 조작을 실행

RMI 연결기의 예는, 디렉토리 work_dir`/jmx_examples/Basic` 내에 있습니다.

1. work_dir`/jmx_examples/Basic` 디렉토리를 엽니다.

이 디렉토리내에는, 다음의 파일이 있습니다.

- `Server.java`
- `SimpleStandardMBean.java`
- `SimpleStandard.java`
- SimpleDynamic.java
- `ClientListener.java`
- `Client.java`
- `README`

2. 텍스트 문자 편집기로 각각의 `*. java` 파일을 엽니다.

### 3.1. 1 예제 클래스의 분석

다음의 섹션에서는, 기본적인 MBean 의 예제로 사용되는 각 클래스를 분석해, 각 클래스가 지금까지의 섹션으로 설명한 조작을 어떻게 실행할까에 임해서 설명합니다.

#### 3.1. 1.1 Server.java

`Server.java` 클래스는, 그 크기에 의해, 몇개의 코드 (발췌)로 나타납니다.

코드예 3-1 MBean 의 예제 클래스 Server.java (발췌 1)

    public class Server {

     public static void main(String[] args) {
         try {

             MBeanServer mbs = MBeanServerFactory.createMBeanServer();
             waitForEnterPressed();

             String domain = mbs.getDefaultDomain();
             waitForEnterPressed();

             String mbeanClassName = "SimpleStandard";
             String mbeanObjectNameStr =
                 domain + ":type=" + mbeanClassName + ", name=1";
             ObjectName mbeanObjectName =
                 createSimpleMBean(mbs, mbeanClassName, mbeanObjectNameStr);
             waitForEnterPressed();

             printMBeanInfo(mbs, mbeanObjectName, mbeanClassName);
             waitForEnterPressed();

             manageSimpleMBean(mbs, mbeanObjectName, mbeanClassName);
             waitForEnterPressed();

             mbeanClassName = "SimpleDynamic";
             mbeanObjectNameStr =
                 domain + ":type=" + mbeanClassName + ", name=1";
             mbeanObjectName =
                 createSimpleMBean(mbs, mbeanClassName, mbeanObjectNameStr);
             waitForEnterPressed();

             printMBeanInfo(mbs, mbeanObjectName, mbeanClassName);
             waitForEnterPressed();

             manageSimpleMBean(mbs, mbeanObjectName, mbeanClassName);
             waitForEnterPressed();

             [...]

이 클래스를 검토하면(자), 다음의 이벤트가 일어나고 있는 것을 알 수 있습니다.

우선,`Server.java` 클래스는,`MBeanServerFactory` 클래스의 `createMBeanServer()` 메소드를 호출해 `mbs` 로 불리는 새로운 MBean 서버를 작성합니다.

다음에 MBean 서버를 등록하는 디폴트 도메인을,`MBeanServer` 인터페이스의 `getDefaultDomain()` 메소드를 호출해 가져옵니다. 이 도메인은, 캐릭터 라인 `domain` 로 식별됩니다.

MBean 클래스 `SimpleStandard` 도, 이 경우는 캐릭터 라인 `mbeanClassName` 라고 하는 변수에 의해 식별됩니다. `SimpleStandard` 는, 이 MBean 를 인스턴스로 하는 Java 객체의 Java 클래스의 이름입니다. ``SimpleStandard.java` 객체에 대해서는,「3.1. 1.3 SimpleStandard.java」 를 참조해 주세요.`

하나 더의 변수, 캐릭터 라인 `mbeanObjectNameStr` 는, 도메인과 다음의 키=치 페어를 조합해 정의됩니다.

- `type`. 이 경우는,`mbeanClassName`.
- `name`. 이 MBean 를, 다음에 작성되는 같은 타입의 다른 MBean 와 구별합니다. 이 경우, name 번호는 `1` 입니다.

`mbeanObjectNameStr` 의 목적은, 인간이 읽을 수 있는 식별자를 MBean 에 할당하는 것입니다.

createSimpleMBean()의 호출에 의해, 지정된 객체명의 SimpleStandard MBean 가 로컬 MBean 서버로 작성되어 등록됩니다.

다음에,`printMBeanInfo()` 과 `manageSimpleMBean()` 의 양쪽 모두의 조작이,`SimpleStandard` MBean 로 실행됩니다. ``createSimpleMBean()` 와 같이, 이러한 메소드는 다음에 `Server.java` 코드로 정의되어코드예 3-4 와코드예 3-5 로 나타납니다.`

이 코드에는 기술되고 있지 않습니다만,`SimpleDynamic` 형의 2 번째의 MBean 가,`SimpleStandard` MBean 와 완전히 같은 방법으로 MBean 서버에 작성되어 등록됩니다. 그 이름이 가리키도록(듯이), 이 MBean 는 「3.1. 1.4 SimpleDynamic.java」 로 설명하는 `SimpleDynamic` Java 객체의 인스턴스입니다.

코드예 3-2 MBean 의 예제 클래스 Server.java (발췌 2)

    [...]

    JMXServiceURL url =
      new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/server");
    JMXConnectorServer cs =
      JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
    cs.start();
    waitForEnterPressed();
    cs.stop();

    [...]

코드예 3-2 에서는, RMI 연결기 서버는 MBean 로 원격 조작을 할 수 있도록(듯이) 작성되고 있습니다. `JMXServiceURL` 클래스를 호출하면(자), 연결기 서버의 주소가 되는 `url` 라고 하는 새로운 서비스 URL 가 작성됩니다. 이 예에서는, 서비스 URL 는 「encode 형식」은 아니고 「JNDI 형식」에서 지정됩니다 (JNDI 형식의 자세한 것은,`javax.management.remote.rmi` 패키지의 API 문서를 참조). 이 서비스 URL 는, 다음의 내용을 정의하고 있습니다.

- 연결기는 `rmi` 로 나타내지는 디폴트의 RMI 트랜스폴트를 사용한다
- RMI 연결기 Stub가 보존되는 RMI 레지스트리는, 로컬 호스트의 포트 `9999` 로 가동해, 서버 주소는 `server` 의 이름으로 등록된다. 예로 지정되는 포트 `9999` 는 임의의 숫자. 사용 가능한 포트를 지정할 수 있다

RMI 연결기 서버 `cs` 는, 파라미터에 서비스 URL `url`,`null` 환경 맵, 및 MBean 서버 `mbs` 를 사용해, 생성자 `JMXConnectorServerFactory` 를 호출해 작성됩니다. 연결기 서버 `cs` 는,`JMXConnectorServer` 의 `start()` 메소드를 호출해,`RMIConnectorServer` 가 RMI 객체 `server` 를 RMI 레지스트리에 export 하는 것으로 기동됩니다. 이 접속은, Enter 키를 누를 때까지 유효합니다. 이것은 `Server` 코드의 후반에 정의하는 간단한 메소드 `waitForEnterPressed` 의 순서에 따른 것입니다.

코드예 3-3 MBean 의 예제 클래스 Server.java (발췌 3)

    [...]

    private static ObjectName createSimpleMBean(MBeanServer mbs,
                                                  String mbeanClassName,
                                                  String mbeanObjectNameStr) {
         echo("\n>>> Create the " + mbeanClassName +
              " MBean within the MBeanServer");
         echo("ObjectName = " + mbeanObjectNameStr);
         try {
              ObjectName mbeanObjectName =
                 ObjectName.getInstance(mbeanObjectNameStr);
              mbs.createMBean(mbeanClassName, mbeanObjectName);
                 return mbeanObjectName;
              } catch (Exception e) {
                echo(	"!!! Could not create the " +
                      mbeanClassName + " MBean !!!");
                e.printStackTrace();
                echo("\nEXITING...\n");
                System.exit(1);
            }
            return null;
         }

    [...]

코드예 3-3 는,`createSimpleMBean()` 메소드의 정의를 나타내고 있습니다. 이 메소드에서는, 객체명 `mbeanObjectNameStr` 를 사용한 MBean 인스턴스가,`ObjectName` 인터페이스의 `getInstance()` 메소드에게 건네져 MBean 서버내에서 MBean 에 등록하기 위한 새로운 객체명이 작성됩니다. 최종적인 객체명 인스턴스는,`mbeanObjectName` 로 설정됩니다. 다음에 `MBeanServer` 의 메소드 `createMBean()` 에 의해,`mbeanClassName` 로 식별되는 Java 객체와 MBean 인스턴스 `mbeanObjectName` 의 편성에 의해 MBean 의 인스턴스가 작성되어 MBean 서버 `mbs` 에 이 MBean 가 등록됩니다.

코드예 3-4 MBean 의 예제 클래스 Server.java (발췌 4)

    [...]

    private static void printMBeanInfo(MBeanServer mbs,
                                         ObjectName mbeanObjectName,
                                         String mbeanClassName) {
         MBeanInfo info = null;
         try {
             info = mbs.getMBeanInfo(mbeanObjectName);
         } catch (Exception e) {
             echo(	"!!! Could not get MBeanInfo object for " +
         	 mbeanClassName +" !!!");
             e.printStackTrace();
             return;
         }

         MBeanAttributeInfo[] attrInfo = info.getAttributes();
         if (attrInfo.length > 0) {
             for (int i = 0; i < attrInfo.length; i++) {
         	echo(" ** NAME: 	" + attrInfo[i]. getName());
         	echo("    DESCR: 	" + attrInfo[i]. getDescription());
         	echo("    TYPE: 	" + attrInfo[i]. getType() +
                   	"READ: "+ attrInfo[i]. isReadable() +
                   	"WRITE: "+ attrInfo[i]. isWritable());
            }
         } else echo(" ** No attributes **");

    [...]

코드예 3-4 는,`printMBeanInfo()` 메소드의 정의를 나타내고 있습니다. printMBeanInfo() 메소드는 `MBeanServer` 의 메소드 `getMBeanInfo()` 를 호출해,`mbeanObjectName` 에 의해 개시되는 속성과 조작의 상세를 가져옵니다. ``MBeanAttributeInfo` 는 다음의 메소드를 정의합니다. 그러한 메소드는 각각,`mbeanObjectName` MBean 의 속성에 관한 정보를 취득하는 경우에 불려 갑니다.`

- `getName`. 속성의 이름을 취득한다.
- `getDescription`. 인간이 읽을 수 있는 속성의 설명을 취득한다
- `getType`. 속성의 클래스명을 취득한다
- `isReadable`. 속성이 읽어내 가능한가 아닌가를 판단한다
- `isWritable`. 속성이 기입해 가능한가 어떤가를 판단한다.

여기에는 가리키고 있지 않습니다만, 호출을 하는 것은,`mbeanObjectName` MBean 의 생성자 , 조작, 및 통지에 관한 정보를 취득하기 (위해)때문에입니다.

- `MBeanConstructorInfo`. MBean 의 Java 클래스에 관한 정보를 취득한다.
- `MBeanOperationInfo`. MBean 로 실행되는 조작의 내용, MBean 로 사용되는 파라미터의 종류를 학습한다
- `MBeanNotificationInfo`. MBean 의 조작이 실행되었을 경우에, MBean 로부터 송신되는 통지의 종류를 조사한다

코드예 3-5 MBean 의 예제 클래스 Server.java (발췌 5)

    [...]

    private static void manageSimpleMBean(MBeanServer mbs,
                                            ObjectName mbeanObjectName,
                                            String mbeanClassName) {
            try {
                printSimpleAttributes(mbs, mbeanObjectName);

                Attribute stateAttribute = new Attribute("State",
                                                         "new state");
                mbs.setAttribute(mbeanObjectName, stateAttribute);

                printSimpleAttributes(mbs, mbeanObjectName);

                echo("\n    Invoking reset operation...");
                mbs.invoke(mbeanObjectName, "reset", null, null);

                printSimpleAttributes(mbs, mbeanObjectName);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        private static void printSimpleAttributes(
                                            MBeanServer mbs,
                                            ObjectName mbeanObjectName) {
            try {
                String State =
                   (String) mbs.getAttribute(mbeanObjectName, "State");
                Integer NbChanges =
                   (Integer) mbs.getAttribute(mbeanObjectName,
                                              "NbChanges");
            } catch (Exception e) {
                echo(	"!!! Could not read attributes !!!");
                e.printStackTrace();
            }
       }

    [...]

코드예 3-5 는 간단한 MBean 를 관리하기 위한 방법을 나타내고 있습니다.

우선,`manageSimpleMBean()` 메소드가,`Server` 에서도 정의되는 `printSimpleAttributes()` 메소드를 호출합니다. ``printSimpleAttributes()` 메소드는, MBean `mbeanObjectName` 로부터 `state` 라고 하는 MBean 속성과`NbChanges` 라고 하는 이제(벌써) 1 개의 MBean 속성을 가져옵니다. 이러한 속성은 모두,「3.1. 1.3 SimpleStandard.java」에 나타내도록(듯이),`SimpleStandard` 클래스에서 정의됩니다.`

다음에 `manageSimpleMBean()` 메소드는,`Attribute` 클래스의 인스턴스인 속성 `stateAttribute` 를 정의합니다. `stateAttribute` 속성은, 값 `new state` 를 `SimpleStandard` 로 정의되는 기존의 속성 `state` 에 관련짓습니다. 다음에 `MBeanServer` 의 `setAttribute()` 메소드에 호출하는 것으로,`mbeanObjectName` MBean 상태가 `stateAttribute` 로 정의되는 새로운 상태로 설정됩니다.

마지막에 `MBeanServer` 의 `invoke()` 메소드에 호출하는 것으로,`mbeanObjectName` MBean 의 `reset` 조작이 기동합니다. reset 조작은,`SimpleStandard` 클래스에서 정의됩니다.

#### 3.1. 1.2 SimpleStandardMBean.java

`SimpleStandardMBean.java` 클래스를코드예 3-6 에 나타냅니다.

코드예 3-6 MBean 의 예제 클래스 SimpleStandardMBean.java

    public interface SimpleStandardMBean {

           public String getState();
           public void setState(String s);
           public int getNbChanges();
           public void reset();

    }

`SimpleStandardMBean.java` 클래스는, MBean `SimpleStandard` 의 간단한 JMX 스펙의 관리 인터페이스입니다. 이 인터페이스는, JMX 에이전트로부터의 관리를 위해서(때문에) `SimpleStandard` 로 정의된 4 개의 조작을 공개합니다.

#### 3.1. 1.3 SimpleStandard.java

`SimpleStandardMBean.java` 클래스를코드예 3-7 에 나타냅니다.

코드예 3-7 MBean 의 예제 클래스 SimpleStandard.java

    public class SimpleStandard
        extends NotificationBroadcasterSupport
        implements SimpleStandardMBean {
        public String getState() {
           return state;
        }
        public void setState(String s) {
           state = s;
           nbChanges++;
        }

        public int getNbChanges() {
            return nbChanges;
        }

        public void reset() {
           AttributeChangeNotification acn =
               new AttributeChangeNotification(this,
                                              0,
                                              0,
                                              "NbChanges reset",
                                              "NbChanges",
                                              "Integer",
                                              new Integer(nbChanges),
                                              new Integer(0));
           state = "initial state";
           nbChanges = 0;
           nbResets++;
           sendNotification(acn);
        }

        public int getNbResets() {
           return nbResets;
        }

        public MBeanNotificationInfo[] getNotificationInfo() {
            return new MBeanNotificationInfo[] {
    	  new MBeanNotificationInfo(
    	  new String[] {
    	    AttributeChangeNotification.ATTRIBUTE_CHANGE },
    	    AttributeChangeNotification.class.getName(),
    	    "This notification is emitted when the reset()
    	     method is called. ")
    	};
        }

        private String state = "initial state";
        private int nbChanges = 0;
        private int nbResets = 0;

    }

`SimpleStandard` 클래스는, 간단한 JMX 스펙의 표준 MBean 를 정의합니다.

`SimpleStandard` MBean 는,「3.1. 1.2 SimpleStandardMBean.java」 에 나타내도록(듯이), 대응하는 `SimpleStandardMBean` 인터페이스를 구현하는 것으로, 관리를 위한 조작과 속성을 개시합니다.

이 MBean 로 개시되는 간단한 조작을 다음에 나타냅니다.

- 상태를 정의한다
- 현재 상태를 갱신한다
- 상태의 갱신 회수를 카운트 한다
- 상태의 값이라고 변경 회수를 원의 값인 제로에 리셋 한다
- 리셋가 불려 갔을 경우에 항상 통지를 송신한다

리셋 조작에 의해 발행되는 통지는, 클래스 `AttributeChangeNotification` 의 인스턴스이며, 리셋의 호출전에 `State` 속성으로 실행된 변경수에 관한 정보를 수집합니다. 송신되는 통지의 내용은,`MBeanNotificationInfo` 인스턴스로 정의됩니다.

#### 3.1. 1.4 SimpleDynamic.java

`SimpleDynamic` 클래스를코드예 3-8 에 나타냅니다.

코드예 3-8 MBean 의 예제 클래스 SimpleDynamic.java

    public class SimpleDynamic
        extends NotificationBroadcasterSupport
        implements DynamicMBean {

        public SimpleDynamic() {
            buildDynamicMBeanInfo();
        }

    [...]

`SimpleDynamic` 의 동적 MBean 에서는,`DynamicMBean` 인터페이스를 구현하는 것으로, 실행시에 관리용의 속성과 조작을 개시하는 방법을 나타냅니다. 여기에서는, 우선, MBean 에 관한 정보를 동적으로 취득하기 위한 메소드 `buildDynamicMBeanInfo()` 의 정의로부터 개시합니다. `buildDynamicMBeanInfo()` 메소드는, 동적 MBean 에 `MBeanInfo` 를 구축합니다.

`SimpleDynamic` 외 코드는,`DynamicMBean` 인터페이스의 구현에 대응하고 있습니다. 개시되는 속성, 조작, 통지는,`SimpleStandard` MBean 로 개시되는 것 것과 같습니다.

#### 3.1. 1.5 ClientListener.java

`ClientListener.java` 클래스를코드예 3-9 에 나타냅니다.

코드예 3-9 MBean 의 예제 클래스 ClientListener.java

    public class ClientListener implements NotificationListener {
     public void handleNotification(Notification notification, Object handback)
         {
             System.out.println("\nReceived notification: " + notification);
         }
    }

`ClientListener` 클래스는, 간단한 JMX 스펙의 통지 리스너를 구현합니다.

통지가 수령되면(자),`NotificationListener` 인터페이스의 `handleNotification()` 메소드가 불려 가 통지의 수령을 확인하기 위한 메세지가 인쇄됩니다.

#### 3.1. 1.6 Client.java

`Client.java` 클래스를코드예 3-10 에 나타냅니다.

코드예 3-10 MBean 의 예제 클래스 Client.java

    public class Client {

      public static void main(String[] args) {
        try {
          // Create an RMI connector client
          //
          JMXServiceURL url = new JMXServiceURL(
             "service:jmx:rmi:///jndi/rmi://localhost:9999/server");
          JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
          ClientListener listener = new ClientListener();
          MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
          waitForEnterPressed();

          // Get domains from MBeanServer
          //
          String domains[] = mbsc.getDomains();
          for (int i = 0; i < domains.length; i++) {
              System.out.println("Domain[" + i + "] = " + domains[i]);
          }
          waitForEnterPressed();

          String domain = mbsc.getDefaultDomain();

          // Create SimpleStandard MBean
          ObjectName mbeanName =
                 new ObjectName(domain +":type=SimpleStandard, name=2");
          mbsc.createMBean("SimpleStandard", stdMBeanName, null, null);
          waitForEnterPressed();

          // Create SimpleDynamic MBean
          ObjectName dynMBeanName =
              new ObjectName(domain +":type=SimpleDynamic, name=2");
          echo("\nCreate SimpleDynamic MBean...");
          mbsc.createMBean("SimpleDynamic", dynMBeanName, null, null);
          waitForEnterPressed();

          // Get MBean count
          echo("\nMBean count = " + mbsc.getMBeanCount());

          // Query MBean names
          echo("\nQuery MBeanServer MBeans:");
          Set names = mbsc.queryNames(null, null);
          for (Iterator i = names.iterator(); i.hasNext(); ) {
          echo(	"ObjectName = " + (ObjectName) i.next());
          }
          waitForEnterPressed();

          mbsc.setAttribute(stdMBeanName,
                            new Attribute("State", "changed state"));

          SimpleStandardMBean proxy = JMX.newMBeanProxy(
              mbsc, stdMBeanName, SimpleStandardMBean.class, true);
          echo("\nState = " + proxy.getState());

          ClientListener listener = new ClientListener();
          mbsc.addNotificationListener(stdMBeanName, listener, null, null);

          mbsc.invoke(stdMBeanName, "reset", null, null);

          mbsc.removeNotificationListener(stdMBeanName, listener);
          mbsc.unregisterMBean(stdMBeanName);

          [...]

          jmxc.close();
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }
    [...]

`Client.java` 클래스는, RMI 연결기 클라이언트를 작성합니다. 이 클라이언트는,`Server.java` 로 작성되는 RMI 연결기 서버에의 접속용으로 설정됩니다.

`Client.java` 는 `Server.java` 로 정의되는 것과 같은 서비스 URL,`url` 를 정의합니다. 이것에 의해, 연결기 클라이언트는, 로컬 호스트의 포트 `9999` 로 동작하는 RMI 레지스트리로부터 RMI 연결기 서버 Stub `server` 를 취득해, RMI 연결기 서버에 접속할 수가 있습니다.

RMI 레지스트리가 이와 같이 특정된 후, 연결기 클라이언트를 작성할 수 있습니다. 연결기 클라이언트 `jmxc` 는,`JMXConnectorFactory` 의 `connect()` 메소드에 의해 작성된 인터페이스 `JMXConnector` 의 인스턴스입니다. `connect()` 메소드는, 불려 가면(자), 파라미터 `url` 와 `null` 환경 맵이 건네받습니다.

또 클라이언트는,「3.1. 1.5 ClientListener.java」 에 나타내도록(듯이),`ClientListener` 의 인스턴스를 작성해 통지를 대기합니다.

다음에,`JMXConnector` 인스턴스 `jmxc` 의 `getMBeanServerConnection()` 메소드를 호출해, JMX 스펙 `MBeanServerConnection` 의 인스턴스 `mbsc` 가 작성됩니다.

이것에 의해 연결기 클라이언트는 `Server.java` 로 작성된 MBean 서버에 접속되어 양단에의 접속이 완전하게 투과적인 상태에 있으면 MBean 의 등록과 MBean 에서의 조작이 가능하게 됩니다.

클라이언트는,`MBeanServerConnection` 의 `createMBean()` 메소드를 호출해, MBean 서버에 `SimpleStandard` MBean 와 SimpleDynamic MBean 를 작성 및 등록합니다. 그리고,`SimpleStandard` 와 `SimpleDynamic` 로 정의된 조작을, 로컬 JMX 스펙의 MBean 조작과 완전히와 같이 실행합니다. ``

MBean 프록시에 의해 Java 인터페이스를 개입시켜 MBean 에 액세스 할 수 있기 (위해)때문에, 긴 코드를 기술하지 않아도, 프록시상에서 호출해 원격 MBean 에 액세스 할 수 있습니다. `SimpleStandardMBean` 의 MBean 프록시를 여기서 작성하려면 ,`javax.management.JMX` 클래스의 `newMBeanProxy()` 메소드를 호출해, MBean 의 `MBeanServerConnection`, 객체명, MBean 인터페이스의 클래스명, 및 true 를 건네주어, 이 프록시가 `NotificationBroadcaster` 로서 동작할 필요가 있는 것을 알립니다. MXBean 의 프록시를 표준 MBean 의 경우와 완전히 같은 방법으로 작성하려면 ,`newMBeanProxy()` 는 아니고 `newMXBeanProxy()` 를 호출합니다.

SimpleDynamic 로 실행되는 각 조작은,`SimpleStandard` 로 실행되는 것 것과 같기 때문에, 여기에서는 조작의 코드를 기재하고 있습니다.

마지막으로, 클라이언트는 `SimpleStandard` MBean 의 등록을 해제해, 접속을 종료합니다. 마지막 `removeNotificationListener` 는 생략 가능합니다. 이것은 원격 클라이언트로 등록된 리스너는, 그 클라이언트의 종료시에 삭제되기 (위해)때문에입니다.

### 3.1. 2 MBean 의 예제의 실행

클래스의 예제를 검증한 후, 이번은 예제를 실행합니다. 예제를 실행하려면 , 다음의 순서에 따르는지,`README` 파일을 참조합니다.

1. Java 클래스를 컴파일 합니다.

`$` javac *. java

2. 로컬 호스트의 포트 `9999` 로 RMI 레지스트리를 기동합니다.

RMI 레지스트리는,`Server` 에 의해 RMI 연결기 Stub의 등록에 사용됩니다.

`$` rmiregistry 9999 &

3. `Server` 클래스를 기동합니다.

`$` java -classpath . 서버

MBean 서버의 작성, 및 MBean 서버에서의 `SimpleStandard` MBean 의 작성을 확인하는 prompt가 표시됩니다. 다음에 `SimpleStandard` MBean 에 관한 정보를 취득해, 이 MBean 로 조작을 실행하는 경우는, Enter 키를 누르도록(듯이) 요구됩니다.

`SimpleStandard` 에서의 조작이 종료하면(자),`SimpleDynamic` MBean 에 대해, 같은 프로세스가 반복해집니다.

표준 및 동적 MBean 가 작성되어 각 MBean 상에서의 조작이 실행된 후, RMI 연결기 서버의 작성이 표시됩니다. 이 서버를 사용하면(자), 원격 `Client` 로부터 MBeans 상에서 조작을 실행할 수 있습니다.

4. 다른 단말 윈도우로 `Client` 클래스를 기동합니다.

`$` java -classpath . 클라이언트

RMI 연결기의 작성, 및 연결기 서버와의 접속의 작성의 확인이 표시됩니다. 도메인명과`SimpleStandard` 및 SimpleDynamic 의 MBean 의 작성과 등록에 대해서도 통지됩니다. 클라이언트는 다음에,`SimpleStandard` 와 SimpleDynamic 의 양 MBean 로 조작을 실행해, 그 후, 양 MBean 의 등록을 해제합니다.

목차 | 전의 항목 | 다음의 항목 | Java Management Extensions (JMX) 테크놀러지의 튜토리얼 Java Management Extensions (JMX), Java Platform, Standard Edition 6

Copyright © 2006 Sun Microsystems, Inc. All rights reserved.