검색 서비스 - xrath.com 에서 번역됨

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

## 제 4 장

## 검색 서비스

Java Management Extension (JMX) 스펙에서는, 다음의 섹션으로 설명하는 기존의 검색 테크놀러지를 사용한, 검색 서비스의 3 개의 바인딩을 정의하고 있습니다.

- 「4.1 초기설정」 에서는, 3 타입의 모든 검색 서비스에 적용되는 설정 정보를 제공합니다.
- 「4.2 Service Location Protocol (SLP) 검색 서비스」 에서는, SLP 검색의 예를 나타냅니다.
- 「4.3 Jini 검색 서비스」 에서는, Jini 검색의 예를 나타냅니다.
- 「4.4 Java Naming and Directory Interface (JNDI) /LDAP 검색 서비스」 에서는, JNDI/LDAP 검색의 예를 나타냅니다.

검색 서비스를 사용하면(자), JMX 테크놀러지의 클라이언트는, 검색 서비스에 등록되어 있는 연결기 서버를 검색해, 접속할 수가 있습니다.

## 4.1 초기설정

「3.1 RMI 연결기를 사용한 표준 및 동적 MBean 에의 액세스」 로 간단하게 가리킨 것처럼, 원격 메소드 호출 (RMI) 연결기를 사용하고 있는 경우, 검색하는 연결기 서버 Stub의 등록에 외부 디렉토리를 사용할 수가 있습니다. RMI 연결기에 관련한 검색 서비스의 예의 안으로, 다음의 케이스를 나타냅니다.

- 다음의 외부 디렉토리의 어느쪽이든을 사용한 RMI 연결기

- RMI 레지스트리. 디폴트의 Java Remote Method Protocol (JRMP) 트랜스폴트를 구현하는 RMI 연결기전용
- CORBA 네임 서비스. Internet Inter-ORB Protocol (IIOP) 트랜스폴트를 구현하는 RMI 연결기전용
- Lightweight Directory Access Protocol (LDAP). IIOP 와 JRMP 의 양트랜스폴트전용

- 외부 디렉토리를 사용하지 않는 RMI 연결기

외부 디렉토리에 RMI 연결기 Stub를 등록하는 경우, RMI 레지스트리, CORBA 네임 서비스, 또는 LDAP 서버의 설정을 위한 초기설정이 필요하게 됩니다. 외부 디렉토리를 사용하지 않는 경우, RMI 연결기 Stub는 JMX 서비스 URL 에 encode 됩니다.

다음의 섹션에서는, RMI 연결기를 사용하는 검색 서비스의 예에 사용할 수 있는 외부 디렉토리에 도착해 설명합니다. 이러한 외부 디렉토리는, 이 장의 이후의 섹션으로 가리키는 검색 서비스의 3 개의 예를 실행하는 경우에 참조됩니다.

### 4.1. 1 외부 RMI 레지스트리

JRMP 트랜스폴트를 구현하는 연결기로 사용하기 위해서, 외부 RMI 레지스트리에 RMI 연결기 서버 Stub를 등록하려면 , 다음의 순서를 실행합니다.

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

「 제 3 장 JMX 연결기」 의 예와 같게, RMI 레지스트리는 JRMP 트랜스폴트를 구현하는 RMI 연결기용의 RMI 연결기 Stub를 포함하기 위해서 사용됩니다.

`$` rmiregistry 9999 &

2. 커멘드를 입력하는 경우, RMI 레지스트리의 주소에 환경 변수를 작성하면(자) 편리합니다.

예를 실행할 경우에 입력하는 커멘드를 짧게 하기 위해서, RMI 레지스트리의 서비스 URL 를 환경 변수 `jndirmi` 로서 설정합니다. 다음의 예에서는, 서비스 URL 는 JNDI 형식에서 지정되고 있습니다. JNDI 형식의 자세한 것은,`javax.management.remote.rmi` 패키지의 API 문서를 참조해 주세요. 로컬 머신 이외의 머신으로 외부 디렉토리를 실행하는 경우는, 로컬 호스트 대신에, 그 머신의 호스트명을 지정할 필요가 있습니다.

`$` jndirmi="rmi://localhost:9999"

### 4.1. 2 외부 CORBA 네임 서비스

IIOP 트랜스폴트를 구현하는 연결기로 사용하기 위해서, 외부 CORBA 네임 서비스에 RMI 연결기 서버 Stub를 등록하려면 , 다음의 순서를 실행합니다.

1. 로컬 호스트의 포트 7777 으로, Object Request Broker (ORB) demon를 기동합니다.

IIOP 트랜스폴트를 구현하는 RMI 연결기는, CORBA 네임을 사용해 RMI 연결기 Stub를 식별할 수 있습니다.

`$` orbd -ORBInitialPort 7777 &

2. 커멘드를 입력하는 경우에 대비해, CORBA 네임 서비스의 주소에 환경 변수를 작성합니다.

예를 실행할 경우에 입력하는 커멘드를 짧게 하기 위해서, CORBA 네임 서비스의 서비스 URL 를 환경 변수 jndiiiop 로서 설정합니다. 다음의 예에서는, 서비스 URL 는 JNDI 형식에서 지정되고 있습니다. 로컬 머신 이외의 머신으로 외부 디렉토리를 실행하는 경우는, 로컬 호스트 대신에, 그 머신의 호스트명을 지정할 필요가 있습니다.

`$` jndiiiop="iiop://localhost:7777"

### 4.1. 3 외부 LDAP 레지스트리

JRMP 또는 IIOP 트랜스폴트의 어느쪽이든을 구현하는 연결기로 사용하기 위해서, 외부 LDAP 레지스트리에 RMI 연결기 서버 Stub를 등록하려면 , 다음의 순서를 실행합니다.

1. LDAP 서버를 기동합니다.

사용하는 LDAP 서버는 선택할 수 있습니다만, LDAP 디렉토리에서 Java 객체를 나타내기 위한 schema가 서버에 인식되고 있을 필요가 있습니다. 자세한 것은, 관련하는 Request For Comments (RFC) 문서를 참조해 주세요.

`http://www.ietf.org/rfc/rfc2713.txt`

2. 도메인 컴퍼넌트의 사픽스를 작성합니다.

다음의 예에서는, 다음의 도메인 컴퍼넌트의 사픽스의 작성이 필요하게 됩니다.

`dc=Test`

서버의 설정 방법법과 이 사픽스의 작성 방법의 자세한 것은, 사용의 LDAP 서버에 부속의 문서를 참조해 주세요.

3. 편의상, 환경 변수에 다음의 LDAP 파라미터를 설정합니다.

이러한 변수는, 외부 LDAP 서버에 RMI 연결기 Stub를 등록하는 검색 서비스의 예로, Server 클래스와 Client 클래스를 기동할 경우에, 입력하는 커멘드를 단축하기 위해서 사용합니다.

1. LDAP 서버를 실행하는 머신의 이름 (ldap_host)

`$` ldaphost=ldap_host

2. LDAP 서버가 가동하는 포트 (ldap_port)

`$` ldapport=ldap_port

3. LDAP 커멘드명 속성. 다음의 예에서는 「Directory Manager」

`$` principal=”cn=Directory Manager”

4. LDAP 서버로 요구되는 패스워드

LDAP 서버의 패스워드를 지정합니다.

`$` credentials=your_ldap_password

5. LDAP 서버의 주소

이 예에서는, LDAP 서버의 서비스 URL 는 JNDI 형식에서 지정되어 변수 jndildap 로 식별됩니다.

`$` jndildap="ldap://$ldaphost:$ldapport"

4. 이것으로, 각종의 검색 서비스의 예를 실행할 준비를 할 수 있었습니다.

## 4.2 Service Location Protocol (SLP) 검색 서비스

JMX 테크놀러지의 스펙에서는, SLP 검색 서비스에 RMI 연결기를 등록할 방법이 지정되고 있습니다.

이 예의 목적은, JMX Remote API 연결기 클라이언트로, SLP 검색 서비스에 등록된 연결기 서버를 검색해, 접속하는 방법을 나타내는 것입니다. 이 예에서는, 다음의 조작을 실행합니다.

1. 에이전트측:

1. MBean 서버를 작성
2. SLP 검색 서비스의 포인터를 취득
3. 연결기 서버를 작성
4. SLP 검색 서비스에 연결기 주소를 등록

2. 클라이언트측:

1. SLP 검색 서비스의 포인터를 취득
2. SLP 검색 서비스에 등록된 모든 연결기 서버를 검색
3. JMX Remote API 연결기를 작성
4. MBean 서버의 MBean 에 관한 정보를 취득

주 – 이 예는, 사용자가 SLP 테크놀러지에 익숙 하고 있는 것을 전제로 기재되어 있습니다. 이 예에 나타내는 코드는, RFC 2614 (http://www.ietf.org/rfc/rfc2614.txt 를 참조)로 정의되고 있는 Sun Microsystems 의 SLP 의 구현에 준거하고 있습니다. Sun Microsystems 의 SLP 의 구현은, 디렉토리 `/usr/share/lib/slp` 의 Solaris 오퍼레이팅(operating) 환경에서 사용할 수 있습니다. Solaris 오퍼레이팅(operating) 환경을 실행하고 있지 않는 경우는, 「RFC 2614, Section 5」에 준거한 버젼의 SLP 를 입수할 필요가 있습니다. OpenSLP Java 구현은,http://www.openslp.org 로부터 다운로드할 수 있습니다.

SLP 검색의 예는, 디렉토리 work_dir`/jmx_examples/Lookup/slp` 내에 있습니다.

1. work_dir`/jmx_examples/Lookup/slp` 를 엽니다.

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

- `Server.java`
- `Client.java`
- `README`

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

이러한 클래스에 도착해, 이후의 섹션으로 분석합니다.

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

다음의 섹션에서는, SLP 검색의 예제로 사용되는 각 클래스를 분석해, 각 클래스가 상기로 설명한 조작을 어떻게 실행할까에 임해서 설명합니다.

주 – Sun Microsystems 의 구현 이외의 SLP 의 구현을 사용하고 있는 경우는,`com.sun.slp` 패키지 대신에 사용하시는 버젼의 SLP Java 클래스를 임포트 하기 위한(해),`Server.java` 와 `Client.java` 를 변경할 필요가 있습니다. RFC 2614, Section 5 를 참조해 주세요.

#### 4.2. 1.1 Server.java

SLP 검색 서비스의 `Server.java` 클래스는, 그 크기에 의해, 몇개의 코드 (발췌)로 나타납니다. 이 예로 사용되는 SLP 코드의 자세한 것은, RFC 2614 로 SLP 의 API 문서를 참조해 주세요.

코드예 4-1 SLP 검색 서비스의 예제 클래스 Server.java (발췌 1)

    public class Server {
       public final static int JMX_DEFAULT_LEASE = 300;
       public final static String JMX_SCOPE = "DEFAULT";

       private final MBeanServer mbs;
       public Server() {
           mbs = MBeanServerFactory.createMBeanServer();
       }

    [...]

코드예 4-1 에서는, 디폴트의 SLP 리스 `JMX_DEFAULT_LEASE` 을, URL 의 등록 기간에 대응하는 디폴트 리스 300 초로 설정해, MBean 서버 `mbs` 의 초기 작성을 실시하고 있습니다.

상기의 코드에서는 가리키고 있지 않습니다만, 다음에 SLP 아드바타이자 `slpAdvertiser` 와 SLP 서비스 URL `url` 를 정의합니다. `slpAdvertiser` 는, SLP 검색 서비스에 서비스 URL 를 등록하는 경우에 사용합니다. `SCOPE` 와 `agentName` 는, SLP 에 검색 속성으로서 등록됩니다.

코드예 4-2 SLP 검색 서비스의 예제 클래스 Server.java (발췌 2)

    [...]

       public static void register(JMXServiceURL jmxUrl, String name)
         throws ServiceLocationException {
         ServiceURL serviceURL =
              new ServiceURL(jmxUrl.toString(),
                             JMX_DEFAULT_LEASE);
         debug("ServiceType is: " + serviceURL.getServiceType());
         Vector attributes = new Vector();
         Vector attrValues = new Vector();
         attrValues.add(JMX_SCOPE);
         ServiceLocationAttribute attr1 =
              new ServiceLocationAttribute("SCOPE", attrValues);
         attributes.add(attr1);
         attrValues.removeAllElements();
         attrValues.add(name);
         ServiceLocationAttribute attr2 =
              new ServiceLocationAttribute("AgentName", attrValues);
         attributes.add(attr2);
         final Advertiser slpAdvertiser =
              ServiceLocationManager.getAdvertiser(Locale.US);
         slpAdvertiser. register(serviceURL, attributes);

       }

    [...]

코드예 4-2 에, JMX 연결기 서버의 URL 의 SLP 검색 서비스에의 등록을 나타냅니다.

JMX 서비스 URL,`jmxUrl` 는, 연결기 서버의 주소이며, 연결기 서버의 기동시에 `JMXConnectorServer` 의 `getAddress()` 메소드를 호출해 가져옵니다.

이 때, 스코프나 연결기 서버 주소가 등록될 때의 에이전트명 (`name`)등의 SLP 검색의 속성은, SLP 클래스 `ServiceLocationAttribute` 에 의해 지정됩니다. `AgentName` 속성은 필수입니다만,`ProtocolType`,`AgentHost`, 및 `Property` 등의 다른 옵션 속성도 SLP 검색 서비스에 등록할 수 있습니다.

마지막으로, JMX 연결기 서버 주소는 `Advertiser` 인터페이스의 `register()` 메소드의 호출에 의해 SLP 서비스에 등록되어 파라미터로서 `serviceURL` 와 `attributes` 가 건네받습니다.

코드예 4-3 SLP 검색 서비스의 예제 클래스 Server.java (발췌 3)

    [...]

       public JMXConnectorServer rmi(String url) throws
         IOException,
         JMException,
         NamingException,
         ClassNotFoundException,
         ServiceLocationException {
         JMXServiceURL jurl = new JMXServiceURL(url);
         final HashMap env = new HashMap();
         // Environment map attributes
         [...]

         JMXConnectorServer rmis =
            JMXConnectorServerFactory. newJMXConnectorServer(jurl, env, mbs);
         final String agentName = System.getProperty("agent.name",
                                                     "DefaultAgent");
         start(rmis, agentName);

         return rmis;
      }
    [...]

코드예 4-3 에, RMI 연결기 서버의 작성을 나타냅니다. JMX 서비스 URL `jurl` 는, 커멘드행으로 `Server` 를 기동하기 위한 커멘드에 포함되는 캐릭터 라인 `url` 로부터 구축됩니다. RMI 연결기 서버,`rmis` 는, 환경`맵`과 주소 `jurl` 로 정의되는 시스템 프로퍼티으로부터 작성됩니다.

다음에 연결기 서버가 기동해, RMI 연결기 서버 주소가 `agentName` 의 이름으로 SLP 검색 서비스에 등록됩니다.

코드예 4-4 SLP 검색 서비스의 예제 클래스 Server.java (발췌 4)

    [...]

       public void start(JMXConnectorServer server, String agentName)
          throws IOException, ServiceLocationException {
          server.start();
          final JMXServiceURL address = server.getAddress();
          register(address, agentName);
       }

    [...]

코드예 4-4 에, 연결기 서버 `server` 의 기동과 지정된 주소 `address` 를 사용한 `server` 의 SLP 검색 서비스에의 등록을 나타냅니다.

#### 4.2. 1.2 Client.java

SLP 검색 서비스의 `Client.java` 클래스를,코드예 4-5 ,코드예 4-6 , 및코드예 4-7 에 나타냅니다.

코드예 4-5 SLP 검색 서비스의 예제 클래스 Client.java (발췌 1)

    public class Client {

        public final static String JMX_SCOPE = "DEFAULT";

        public static Locator getLocator() throws ServiceLocationException {
          final Locator slpLocator =
              ServiceLocationManager.getLocator(Locale.US);
          return slpLocator;
        }

          public static List lookup(Locator slpLocator, String name)
              throws IOException, ServiceLocationException {

              final ArrayList list = new ArrayList();
              Vector scopes = new Vector();

              scopes.add(JMX_SCOPE);
              String query =
                  "(&(AgentName=" + ((name! =null)? name:"*") + ")) ";

              ServiceLocationEnumeration result =
                  slpLocator.findServices(new ServiceType("service:jmx"),
                                          scopes, query);

              while(result.hasMoreElements()) {
                    final ServiceURL surl = (ServiceURL) result.next();

                 JMXServiceURL jmxUrl = new JMXServiceURL(surl.toString());
                 try {
                      JMXConnector client =
                         JMXConnectorFactory.newJMXConnector(jmxUrl, null);
                      if (client ! = null) list.add(client);
                 } catch (IOException x ) {
                 [...]
                 }
              }
          }
          return list;
        }

「코드예 4-5」에서는 우선,SLP 클래스 `ServiceLocationManager` 의 `getLocator` 메소드를 호출해, SLP 서비스 `Locator` 를 가져옵니다. 다음에 `Client` 는, 특정의 에이전트명 또는 특정의 패턴에 일치하는 에이전트명으로 SLP 서비스에 등록된, 모든 연결기 서버를 가져옵니다. `Client` 의 기동시에 에이전트명이 지정되어 있지 않은 경우, 모든 에이전트명이 고려됩니다.

JMX 테크놀러지 서비스 URL,`jmxUrl` 는, SLP 로 취득된 에이전트 마다 생성됩니다. 각 에이전트의 SLP 서비스 URL,`surl` 는 파라미터로서 `JMXServiceURL` 인스턴스에게 건네집니다. URL `jmxUrl` 는,`JMXConnectorFactory` 의 `newJMXConnector()` 메소드에게 건네져 SLP 서비스에 등록되는 각 에이전트에 새로운 연결기 클라이언트 `client` 가 작성됩니다.

취득된 연결기 클라이언트는, 배열 리스트 `list` 에 보존됩니다.

코드예 4-6 SLP 검색 서비스의 예제 클래스 Client.java (발췌 2)

    public static void listMBeans(MBeanServerConnection server)
         throws IOException {

         final Set names = server.queryNames(null, null);
         for (final Iterator i=names.iterator(); i.hasNext(); ) {
              ObjectName name = (ObjectName) i.next();
              System.out.println("Got MBean: "+name);
              try {
                   MBeanInfo info =
                      server.getMBeanInfo((ObjectName) name);
                   MBeanAttributeInfo[] attrs = info.getAttributes();
                   if (attrs == null) continue;
                   for (int j=0; j<attrs.length; j++) {
                        try {
                             Object o =
                             server.getAttribute(name, attrs[j]. getName());
                             System.out.println("\t\t" + attrs[j]. getName() +
                             " = "+o);
                        } catch (Exception x) {
                             System.err.println("JmxClient failed to get " +
                                                 attrs[j]. getName() + x);
                             x.printStackTrace(System.err);
                        }
         }
    }

코드예 4-6 에서는, SLP 서비스에 보존된 연결기 서버 주소를 사용해 작성된 모든 연결기 클라이언트에,`MBeanServerConnection` 의 참조가 취득되고 있습니다. 모든 MBean 와 그 속성의 리스트가 취득됩니다.

코드예 4-7 SLP 검색 서비스의 예제 클래스 Client.java (발췌 3)

    public static void main(String[] args) {
          try {
               final String agentName = System.getProperty("agent.name");
               final Locator slpLocator = getLocator();
               List l = lookup(slpLocator, agentName);
               int j = 1;
               for (Iterator i=l.iterator() ;i.hasNext() ;j++) {
                    JMXConnector c1 = (JMXConnector) i.next();
                    if (c1 ! = null) {
                        try {
                             c1.connect(env);
                        } catch (IOException x) {
                             System.err.println ("Connection failed: " + x);
                             x.printStackTrace(System.err);
                             continue;
                        }

                        MBeanServerConnection conn =
                             c1.getMBeanServerConnection();

                        try {
                             listMBeans(conn);
                        } catch (IOException x) {
                             x.printStackTrace(System.err);
                        }
                        try {
                             c1.close();
                        } catch (IOException x) {
                             x.printStackTrace(System.err);
                        }
                    }
               }
          } catch (Exception x) {
               x.printStackTrace(System.err);
          }
    }

코드예 4-7 에서는,`agent.name` 프로퍼티은 `System` 클래스의 `getProperty()` 메소드를 호출해 취득되어 SLP 검색 서비스는 `Locator` 의 `getLocator()` 메소드를 호출해 검색됩니다.

`agentName` 의 이름을 가지는 모든 에이전트가 검색되어 검출된 에이전트에의 접속이 설정됩니다. 에이전트가 지정되어 있지 않은 경우, 모든 에이전트가 검색됩니다. `Server` 로 작성된 MBean 에의 접속이 설정되어 접속이 절단 되기 전에, 접속내의 모든 MBean 가 리스트 됩니다.

### 4.2. 2 SLP 검색 서비스의 예제의 실행

SLP 를 사용하는 검색 서비스의 예제를 실행하려면 ,「4.1 초기설정」 으로 실행한 작업 외에도, 이 예제에 고유의 초기 작업을 사전에 실행할 필요가 있습니다. 이 작업 후, SLP 를 JMX 테크놀러지로 지원되는 2 개의 연결기와 함께 사용해 연결기의 검색을 개시할 수 있습니다.

예제를 실행하는 경우, 작성된 에이전트의 종류와 에이전트의 작성에 사용된 트랜스폴트를 추적하기 위해서, 대응하는 섹션의 캐릭터 라인에 동일한 문자 사픽스가 에이전트명에 포함되어 있습니다. 예를 들어,「Section a. 외부 디렉토리를 사용하지 않는 JRMP 상의 RMI 연결기」 의 에이전트에는,`test-server-a` 라는 이름이 붙일 수 있고 있습니다.

#### 4.2. 2.1 SLP 검색 서비스의 예제의 설정

다음의 순서는, 이 예제로 실행할 수 있는 모든 트랜스폴트로 요구됩니다.

1. 클래스의 컴파일 및 실행이 용이하게 되도록(듯이), 추가로 환경 변수를 정의합니다.

「4.1 초기설정」 으로 설정된 공통의 환경 변수 외에, SLP 서비스의 패스를 추가할 필요가 있습니다. Solaris 오퍼레이팅(operating) 환경을 사용하고 있는 경우는, 다음의 변수를 추가합니다.

`$` SLPLIB=/usr/share/lib/slp

다른 플랫폼을 사용하고 있는 경우는, 사용하고 있는 플랫폼에 맞추어 `SLPLIB` 를 설정합니다.

2. `classp` 환경 변수를 정의해, export 합니다.

이 예에서는, SLP 의 Java 어카이브(archive) (JAR) 파일을 포함한 클래스 패스가 필요합니다.

`$` classp=$SLPLIB/slp.jar

3. `Client` 클래스와 `Server` 클래스의 예제를 컴파일 합니다.

다음의 커멘드를 입력합니다.

`$` javac -d . -classpath $classp Server.java Client.java

4. SLP demon를 기동합니다.

Solaris 오퍼레이팅(operating) 환경을 사용하고 있는 경우, 다음의 커멘드를 입력합니다만, 이것에는 수퍼 사용자 패스워드가 필요합니다.

`$` su root -c "java -cp $SLPLIB/slpd.jar com.sun.slp.slpd &"

`Password:`[type superuser password]

Solaris 시스템을 실행하고 있지 않는 경우, 사용의 SLP 의 구현에 따라 SLP demon를 기동합니다.

#### 4.2. 2.2 SLP 검색 서비스의 예제의 실행

이 예에서는, SLP 검색 서비스를 사용해, RMI 의 디폴트의 트랜스폴트인 JRMP, 및 IIOP 트랜스폴트를 사용하는 RMI 연결기 서버를 검색하는 방법을 나타냅니다. 그 외 ,「4.1 초기설정」 으로 설명한 것처럼, RMI 연결기 Stub의 등록에는 다른 외부 디렉토리가 사용되고 있습니다.

여기에 나타내는 트랜스폴트와 외부 디렉토리의 편성은 다음과 같습니다.

- 다음의 것을 사용한, JRMP 트랜스폴트상의 RMI 연결기

- 외부 디렉토리 없음
- RMI 레지스트리
- LDAP 레지스트리

- 다음의 것을 사용한, IIOP 트랜스폴트상의 RMI 연결기

- 외부 디렉토리 없음
- CORBA 네임 서비스
- LDAP 레지스트리

다음의 순서에 따라 예제를 실행합니다.

1. `Server` 를 기동합니다.

`Server` 의 기동에 사용하는 커멘드는, 사용하고 있는 외부 디렉토리에 의해 다릅니다. `Client` 를 기동하기 전에, 각종의 트랜스폴트 및 외부 레지스트리를 사용해,`Server` 의 다음의 인스턴스의 1 개 또는 복수를 기동할 수 있습니다.

1. 외부 디렉토리를 사용하지 않는 JRMP 상의 RMI 연결기

다음의 커멘드를 입력해 `Server` 를 기동합니다.

    $ java -classpath . :$classp -Ddebug=true \
      -Dagent.name=test-server-a \
      -Durl ="service:jmx:rmi://" \
      slp.Server &

이 커멘드로,

- `debug` 는 true 로 설정되어`Server` 의 실행시의 화면 출력을 보다 상세한 것으로 합니다.
- 작성되는 에이전트의 이름은 `test-server-a` 입니다.
- 서비스 URL 에 의해, RMI 의 디폴트 트랜스폴트 JRMP 상에서 동작하는 RMI 연결기의 선택이 지정됩니다.

서버가 기동하면(자), RMI 연결기의 작성, 및 그 URL 의 SLP 서비스에의 등록을 확인하는 메세지가 표시됩니다.

2. JRMP 상의 RMI 연결기. 외부 디렉토리에 RMI 레지스트리를 사용합니다.

다음의 커멘드를 입력해 `Server` 를 기동합니다.

    $ java -classpath . :$classp -Ddebug=true \
      -Dagent.name=test-server-b \
      -Durl="service:jmx:rmi:///jndi/${jndirmi}/server" \
      slp.Server &

이 커멘드로,

- 작성되는 에이전트의 이름은 `test-server-b` 입니다.
- 서비스 URL 는, 선택한 연결기를 RMI over JRMP 로서 지정합니다. RMI 연결기 Stub server 가 보존되는 외부 디렉토리는,「4.1 초기설정」 으로 jndirmi 와 특정한 RMI 레지스트리입니다.

`Server` 가 기동하면(자), RMI 연결기의 작성, 및 그 URL 의 SLP 서비스에의 등록을 확인하는 메세지가 표시됩니다.

3. JRMP 상의 RMI 연결기. 외부 디렉토리에 LDAP 를 사용합니다.

다음의 커멘드를 입력해 `Server` 를 기동합니다.

    $ java -classpath . :$classp -Ddebug=true \
      -Dagent.name=test-server-c \
      -Durl="service:jmx:rmi:///jndi/${jndildap}/cn=x, dc=Test" \
      -Djava.naming.security.principal="$principal" \
      -Djava.naming.security.credentials="$credentials" \
      slp.Server &

이 커멘드로,

- 작성되는 에이전트의 이름은 `test-server-c` 입니다.
- 서비스 URL 는, RMI over JRMP 로서 선택되는 연결기를 지정합니다. RMI 연결기 Stub가 보존되는 외부 디렉토리는,「4.1 초기설정」 으로 `jndildap` 와 특정한 LDAP 서버입니다.
- Stub는 LDAP 서버의 `Test` 도메인 컴퍼넌트에 등록됩니다.
- LDAP 서버에 액세스 하기 위한(해), 공통명의 속성 `principal` 와 패스워드 `credentials` 이 지정됩니다.

`Server` 가 기동하면(자), RMI 연결기의 작성, 및 그 URL 가 에이전트명 `test-server-c` 로 SLP 서비스에 등록되는 것을 확인하는 메세지가 표시됩니다.

4. 외부 디렉토리를 사용하지 않는 IIOP 상의 RMI 연결기

다음의 커멘드를 입력해 `Server` 를 기동합니다.

    $ java -classpath . :$classp -Ddebug=true \
      -Dagent.name=test-server-d \
      -Durl="service:jmx:iiop://" \
      slp.Server &

이 커멘드로,

- 작성되는 에이전트의 이름은 `test-server-d` 입니다.
- 서비스 URL 는, IIOP 상의 RMI 연결기로서 선택되는 연결기를 지정합니다.

€`Server` 가 기동하면(자), RMI 연결기의 작성, 및 자동적으로 생성된 URL 의 SLP 서비스에의 등록을 확인하는 메세지가 표시됩니다.

5. IIOP 상의 RMI 연결기. 외부 디렉토리에 CORBA 를 사용합니다.

다음의 커멘드를 입력해 `Server` 를 기동합니다.

    $ java -classpath . :$classp -Ddebug=true \
      -Dagent.name=test-server-e \
      -Durl="service:jmx:iiop:///jndi/${jndiiiop}/server" \
      slp.Server &

이 커멘드로,

- 작성되는 에이전트의 이름은 `test-server-e` 입니다.
- 서비스 URL 는, IIOP 상의 RMI 연결기로서 선택되는 연결기를 지정합니다. RMI 연결기 Stub `server` 가 보존되는 외부 디렉토리는,「4.1 초기설정」 으로 `jndiiiop` 와 특정한 CORBA 네임 서비스입니다.

`Server` 가 기동하면(자), RMI 연결기의 작성, 및 그 URL 가 `test-server-e` 의 이름으로 SLP 서비스에 등록되는 것을 확인하는 메세지가 표시됩니다.

6. IIOP 상의 RMI 연결기. 외부 디렉토리에 LDAP 를 사용합니다.

다음의 커멘드를 입력해 `Server` 를 기동합니다.

    $ java -classpath . :$classp -Ddebug=true \
      -Dagent.name=test-server-f \
      -Durl="service:jmx:iiop:///jndi/${jndildap}/cn=x, dc=Test" \
      -Djava.naming.security.principal="$principal" \
      -Djava.naming.security.credentials="$credentials" \
      slp.Server &

이 커멘드로,

- 작성되는 에이전트의 이름은 `test-server-f` 입니다.
- 서비스 URL 는, 선택된 연결기를 RMI over IIOP 로서 지정합니다. RMI 연결기 Stub가 보존되는 외부 디렉토리는,「4.1 초기설정」 으로 `jndildap` 와 특정한 LDAP 서버입니다.
- Stub는 LDAP 서버의 `Test` 도메인 컴퍼넌트에 등록됩니다.
- LDAP 서버에 액세스 하기 위한(해), 공통명의 속성 `principal` 와 패스워드 `credentials` 가 지정됩니다.

`Server` 가 기동하면(자), RMI 연결기의 작성, 및 그 URL 가 에이전트명 `test-server-f` 로 SLP 서비스에 등록되는 것을 확인하는 메세지가 표시됩니다.

2. `Client` 를 기동합니다.

선택한 트랜스폴트 및 외부 디렉토리를 사용해 `Server` 를 기동한 후,`Client` 를 기동합니다.

    $ java -classpath . :$classp -Ddebug=true \
         -Djava.naming.security.principal="$principal" \
         -Djava.naming.security.credentials="$credentials" \
         slp.Client

`Server` 로 작성되고 검색 서비스에 등록된 에이전트의 검출을 확인하는 출력이 표시됩니다. 또, 에이전트로 설정된 접속의 접속명과 접속의 확인이 표시됩니다.

특정의 에이전트를 검색하려면 , 다음의 커멘드를 입력합니다.

    $ java -classpath . :$classp -Ddebug=true \
         -Djava.naming.security.principal="$principal" \
         -Djava.naming.security.credentials="$credentials" \
         -Dagent.name="agentName" \
        slp.Client

상기의 커멘드로, agentName 는 검색하는 에이전트의 이름입니다. 또,`*` 를 사용해 에이전트명을 부분적으로 지정할 수도 있습니다. 예를 들어, 문자 x 로 시작되는 모든 에이전트명을 검색하는 경우는,`x*` 와 지정합니다.

## 4.3 Jini 검색 서비스

이 예의 목적은, JMX 테크놀러지의 연결기 클라이언트로, Jini 검색 서비스에 등록된 연결기 서버를 검색해, 접속하는 방법을 나타내는 것입니다. 이 예에서는, 다음의 조작을 실행합니다.

1. 에이전트측:

1. MBean 서버를 작성
2. 연결기 서버를 작성
3. Jini 검색 서비스에 연결기 주소를 등록

2. 클라이언트측:

1. Jini 검색 서비스의 포인터를 취득
2. Jini 검색 서비스에 등록된 모든 연결기 서버를 검색
3. JMX Remote API 연결기를 작성
4. MBean 서버의 MBean 에 관한 정보를 취득

Jini 검색 서비스의 예는, 디렉토리 work_dir`/jmx_examples/Lookup/jini` 내에 있습니다.

주 – 이러한 예제에서는, 사용자가 Jini 네트워크 테크놀러지에 익숙 하고 있는 것을 전제로 하고 있습니다. Jini 네트워크 테크놀러지의 문서는,http://www.jini.org 와 http://jini.dev.java.net/ 로 입수할 수 있습니다. Jini 네트워크 테크놀러지는 http://starterkit.dev.java.net/downloads/index.html 로부터 다운로드할 수 있습니다. 이 예에서는, Jini Technology Starter Kit Version 1.2. 1_002 (을)를 사용해 구현하고 있습니다.

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

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

- `Server.java`
- `Client.java`
- `java.policy`
- `jini.properties.template`
- `README`

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

이러한 클래스에 도착해, 이후의 섹션으로 분석합니다.

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

다음의 섹션에서는, Jini 검색 서비스의 예제로 사용되는 각 클래스를 분석해, 각 클래스가 상기로 설명한 조작을 어떻게 실행할까에 임해서 설명합니다.

#### 4.3. 1.1 Server.java

Jini 검색 서비스의 `Server.java` 클래스는, 그 크기에 의해, 일련의 코드예로서 나타나고 있습니다.

코드예 4-8 Jini 검색 서비스의 예제 클래스 Server.java (발췌 1)

    public class Server {
       private final MBeanServer mbs;
       private static boolean debug = false;
       public Server() {
         mbs = MBeanServerFactory.createMBeanServer();
       }

    [...]

코드예 4-8 에, MBean 서버 `mbs` 의 작성을 나타냅니다. SLP 의 예제의 경우와 같게,`Server` 를 커멘드행으로 기동하는 경우, JMX 서비스의 URL 와 에이전트명이 서버에게 건네집니다.

코드예 4-9 Jini 검색 서비스의 예제 클래스 Server.java (발췌 2)

    [...]

       public JMXConnectorServer rmi(String url)
          throws IOException, JMException, ClassNotFoundException {
          JMXServiceURL jurl = new JMXServiceURL(url);
          final HashMap env = new HashMap();
          // Environment map attributes
         [...]
         JMXConnectorServer rmis =
            JMXConnectorServerFactory.newJMXConnectorServer(jurl, env, mbs);

         final String agentName = System.getProperty("agent.name",
                                                     "DefaultAgent");

         start(rmis, env, agentName);

         return rmis;
       }

    [...]

코드예 4-9 에, 환경 맵 `env` 와 주소 `jurl` 로 정의되는 시스템 프로퍼티을 사용한, RMI 연결기 서버 `rmis` 의 작성을 나타냅니다.

RMI 연결기 서버 `rmis` 가 기동합니다. RMI 연결기 서버의 주소는,`agentName` 의 이름으로 Jini 검색 서비스에 등록됩니다.

코드예 4-10 Jini 검색 서비스의 예제 클래스 Server.java (발췌 3)

    [...]

       public void start(JMXConnectorServer server, Map env, String agentName)
          throws IOException, ClassNotFoundException {
          server.start();
          final ServiceRegistrar registrar=getRegistrar();
          final JMXConnector proxy = server.toJMXConnector(env);
          register(registrar, proxy, agentName);
       }

       public static ServiceRegistrar getRegistrar()
          throws IOException, ClassNotFoundException,
             MalformedURLException {
          final String jurl =
             System.getProperty("jini.lookup.url", "jini://localhost");
          final LookupLocator lookup = new LookupLocator(jurl);
          final ServiceRegistrar registrar = lookup.getRegistrar();
          if (registrar instanceof Administrable)
              debug("Registry is administrable. ");
          return registrar;
       }

       public static ServiceRegistration register(ServiceRegistrar registrar,
                                                  JMXConnector proxy, String name)
          throws IOException {
          Entry[] serviceAttrs = new Entry[] {
                  new net.jini.lookup.entry.Name(name)
                           };

          System.out.println("Registering proxy: AgentName=" + name );
          debug("" + proxy);
          ServiceItem srvcItem = new ServiceItem(null, proxy, serviceAttrs);
          ServiceRegistration srvcRegistration =
                 registrar.register(srvcItem, Lease.ANY);
          debug("Registered ServiceID: " +
                                  srvcRegistration.getServiceID(). toString());
          return srvcRegistration;
       }

    [...]

코드예 4-10 에, 환경 맵 `env` 와 서비스 URL `jurl` 를 사용한, 연결기 서버 `server` 의 작성을 나타냅니다. 연결기 서버의 인스턴스 서버는, Jini 검색 서비스 메소드 `LookupLocator.getRegistrar()` 를 호출해 Jini 검색 서비스의 포인터를 가져옵니다.

연결기 서버는, Jini 검색 서비스 locator `registrar` 와 연결기 서버가 등록될 때의 에이전트명을 사용해, 프록시 형식에서 Jini 검색 서비스에 등록됩니다. 프록시는 실제로는, 연결기 서버의 클라이언트 Stub가 되어,`JMXConnectorServer` 의 `toJMXConnector()` 메소드의 호출에 의해 취득됩니다.

등록 자체는, 서비스 항목의 배열을 사용해, Jini 검색 서비스 클래스 `ServiceRegistrar` 의 `register()` 메소드를 호출해 실행됩니다.

#### 4.3. 1.2 Client.java

Jini 검색 서비스의 예제 클래스 `Client.java` 를코드예 4-11 에 나타냅니다.

코드예 4-11 Jini 검색 서비스 예제 클래스 Client.java

    public class Client {

       private static boolean debug = false;
       public static ServiceRegistrar getRegistrar()
           throws IOException, ClassNotFoundException, MalformedURLException {
           final String jurl =
                      System.getProperty("jini.lookup.url", "jini://localhost");
           final LookupLocator lookup = new LookupLocator(jurl);
           final ServiceRegistrar registrar = lookup.getRegistrar();
           if (registrar instanceof Administrable)
                   debug("Registry is administrable. ");
           return registrar;
     }

       public static List lookup(ServiceRegistrar registrar,
               String name) throws IOException {
           final ArrayList list = new ArrayList();
           final Class[] classes = new Class[] {JMXConnector.class};
           final Entry[] serviceAttrs = new Entry[] {
               new net.jini.lookup.entry.Name(name)
       };

       ServiceTemplate template =
            new ServiceTemplate(null, classes, serviceAttrs);
       ServiceMatches matches =
            registrar.lookup(template, Integer.MAX_VALUE);
       for(int i = 0; i < matches.totalMatches; i++) {
            debug("Found Service: " + matches.items[i]. serviceID);
            if (debug) {
               if (matches.items[i]. attributeSets ! = null) {
                       final Entry[] attrs = matches.items[i]. attributeSets;
                       for (int j = 0; j < attrs.length ; j++) {
                           debug("Attribute["+j+"]=" + attrs[j]);
                   }
               }
            }

            if(matches.items[i]. service ! = null) {
                JMXConnector c = (JMXConnector)(matches.items[i]. service);
                debug("Found a JMXConnector: " + c);
                list.add(c);
            }
       }
       return list;
    }

    [...]

코드예 4-11 에, 연결기 클라이언트가 `lookup.getRegistrar()` 의 호출에 의해 Jini 검색 서비스의 포인터를 취득하는 방법을 나타냅니다. 클라이언트는, 다음에 등록명 `name` 를 사용해 Jini 검색 서비스에 엔트리로서 등록된 연결기의 리스트를 가져옵니다. SLP 의 예와 달리, 기동시에 사용자가 `Client` 에 건네준 에이전트명은, 기존의 에이전트명으로 완전하게 일치하는지, Null 가 아니면 안되어, 어느 경우도, Jini 검색 서비스는 모든 에이전트를 검색합니다.

여기에 코드는 나타나고 있지 않습니다만, 연결기의 리스트가 취득되면(자), 클라이언트는 `Server` 에 의해 기동한 MBean 서버에 접속해, 이 서버에 등록된 모든 MBean 를 나타낸 리스트를 가져옵니다.

#### 4.3. 1.3 java.policy

`java.policy` 파일은, 이 예의 위해(때문에) 설정된 Java 테크놀러지의 시큐리티 정책 파일입니다.

#### 4.3. 1.4 jini.properties.template

이 예의 위해(때문에) 설정된, 템플릿 형식의 Jini 네트워킹 테크놀러지 프로퍼티 파일. @INSTALL_HOME_FOR_JINI@ 를 변경해, 파일명을 `jini.properties` 로 변경합니다.

### 4.3. 2 Jini 검색 서비스의 예제의 실행

Jini 검색 서비스를 사용하는 검색 서비스의 예제를 실행하려면 ,「4.1 초기설정」 으로 실행한 작업 외에도, 이 예제에 고유의 초기 작업을 사전에 실행할 필요가 있습니다. Jini 네트워크 테크놀러지를, JMX 테크놀러지로 지원되는 연결기와 함께 사용해 연결기의 검색을 개시할 수 있습니다.

예제를 실행하는 경우, 작성된 에이전트의 종류와 에이전트의 작성에 사용된 트랜스폴트를 추적하기 위해서, 대응하는 섹션의 캐릭터 라인에 동일한 문자 사픽스가 에이전트명에 포함되어 있습니다. 예를 들어,「Section a. 외부 디렉토리를 사용하지 않는 JRMP 상의 RMI 연결기」 의 에이전트는 `test-server-a` 라는 이름이 붙일 수 있습니다.

#### 4.3. 2.1 Jini 검색 서비스의 예제의 설정

다음의 순서는, 이 예제로 실행할 수 있는 모든 트랜스폴트로 요구됩니다.

1. 예제 클래스의 컴파일 및 실행이 용이하게 되도록(듯이), 추가의 환경 변수를 몇개인가 정의합니다.

「4.1 초기설정」 으로 설정한 공통의 환경 변수 외에, Jini 검색 서비스의 패스를 추가할 수 있습니다. Jini 네트워킹 테크놀러지를 인스톨 한 디렉토리는, jini_dir 로서 참조됩니다.

`$` JINI_HOME=jini_dir

`$` JINILIB=$JINI_HOME/lib

2. `classp` 환경 변수를 정의합니다.

이 예에서는, Jini 검색 서비스의 코어와 확장 기능에 사용하는 JAR 파일이 필요하게 됩니다.

`$` classp=$JINILIB/jini-core.jar:$JINILIB/jini-ext.jar

3. `jini.properties` 파일을 작성합니다.

UNIX 플랫폼용의 프로퍼티 파일은, 이 예의 클래스와 같은 디렉토리내에 있습니다. UNIX 플랫폼을 실행하고 있지 않는 경우, 사용의 플랫폼의 프로퍼티 파일은 다음의 디렉토리에서 입수할 수 있습니다.

$JINI_HOME/example/launcher/jini12_<platform>.properties

4. `jini.properties` 파일을 갱신합니다.

갱신에 의해, 시스템에 필요한 모든 패스, 호스트명, 포트 번호가 파일로 지정되지 않으면 안됩니다. UNIX 플랫폼을 실행하고 있지 않는 경우에서도, 참조로서 첨부의 템플릿을 사용할 수 있습니다.

5. Jini 네트워킹 테크놀러지 `StartService` 를 기동합니다.

`$` java -cp $JINILIB/jini-examples.jar com.sun.jini.example.launcher.StartService &

`StartService` 그래피컬 사용자 인터페이스가 열립니다.

6. 각자의 `jini.properties` 파일을 `StartService` 에 로드합니다.

「File」와「Open Property File」를 순서에 클릭해, work_dir`/jmx_examples`/Lookup/jini 로부터 프로퍼티 파일을 선택합니다.

7. Jini 검색 서비스를 개시합니다.

필요한 Jini 검색 서비스를 개시하려면 , 「Run」탭을 클릭해, 다음의 항목의 각각 붙어 「START」버튼을 누릅니다.

- RMID
- WebServer
- Reggie
- LookupBrowser

서비스의 실행을 확인하는 메세지가 표시됩니다.

8. `Client` 클래스와 `Server` 클래스를 컴파일 합니다.

다음의 커멘드를 입력합니다.

`$` javac -d . -classpath $classp Server.java Client.java

#### 4.3. 2.2 Jini 검색 서비스의 예제의 실행

이 예에서는, Jini 검색 서비스를 사용해, RMI 의 디폴트의 트랜스폴트인 JRMP, 및 IIOP 트랜스폴트를 사용하는 RMI 연결기 서버를 검색하는 방법을 나타냅니다. 그 외 ,「4.1 초기설정」 으로 설명한 것처럼, RMI 연결기 Stub의 등록에는 다른 외부 디렉토리가 사용되고 있습니다.

여기에 나타내는 트랜스폴트와 외부 디렉토리의 편성은 다음과 같습니다.

- 다음의 것을 사용한, JRMP 트랜스폴트상의 RMI 연결기

- 외부 디렉토리 없음
- RMI 레지스트리
- LDAP 레지스트리

- 다음의 것을 사용한, IIOP 트랜스폴트상의 RMI 연결기

- 외부 디렉토리 없음
- CORBA 네임 서비스
- LDAP 레지스트리

1. `Server` 를 기동합니다.

`Server` 의 기동에 사용하는 커멘드는, 사용하고 있는 외부 디렉토리에 의해 다릅니다. `Client` 를 기동하기 전에, 각종의 트랜스폴트 및 외부 레지스트리를 사용해,`Server` 의 다음의 인스턴스의 1 개 또는 복수를 기동할 수 있습니다.

1. 외부 디렉토리를 사용하지 않는 JRMP 상의 RMI 연결기

다음의 커멘드를 입력해 Server 를 기동합니다.

    $ java -classpath . :$classp -Ddebug=true \
      -Dagent.name=test-server-a \
      -Durl="service:jmx:rmi://" \
      -Djava.security.policy=java.policy \
      jini.Server &

이 커멘드로,

- `debug` 는 `true` 로 설정되어`Server` 의 실행시의 화면 출력을 보다 상세한 것으로 합니다.
- Jini 검색 서비스에의 액세스를 가능하게 하는, 시큐리티 정책가 지정되고 있습니다.
- 작성되는 에이전트의 이름은 `test-server-a` 입니다.
- 서비스 URL 에 의해, RMI 의 디폴트 트랜스폴트 JRMP 상에서 동작하는 RMI 연결기의 선택이 지정됩니다.

`Server` 가 기동하면(자), RMI 연결기의 작성, 및 그 URL 의 Jini 검색 서비스에의 등록을 확인하는 메세지가 표시됩니다.

2. JRMP 상의 RMI 연결기. 외부 디렉토리에 RMI 레지스트리를 사용합니다.

다음의 커멘드를 입력해 Server 를 기동합니다.

    $ java -classpath . :$classp -Ddebug=true \
      -Dagent.name=test-server-b \
      -Durl="service:jmx:rmi:///jndi/${jndirmi}/server" \
      -Djava.security.policy=java.policy \
      jini.Server &

이 커멘드로,

- Jini 검색 서비스에의 액세스를 가능하게 하는, 시큐리티 정책가 지정되고 있습니다.
- 작성되는 에이전트의 이름은 `test-server-b` 입니다.
- 서비스 URL 는, RMI over JRMP 로서 선택되는 연결기를 지정합니다. RMI 연결기 Stub `server` 가 보존되는 외부 디렉토리는,「4.1 초기설정」 으로 `jndirmi` 로서 특정한 RMI 레지스트리입니다.

`Server` 가 기동하면(자), RMI 연결기의 작성, 및 그 URL 의 Jini 검색 서비스에의 등록을 확인하는 메세지가 표시됩니다.

3. JRMP 상의 RMI 연결기. 외부 디렉토리에 LDAP 를 사용합니다.

다음의 커멘드를 입력해 `Server` 를 기동합니다.

    $ java -classpath . :$classp -Ddebug=true \
      -Dagent.name=test-server-c \
      -Durl="service:jmx:rmi:///jndi/${jndildap}/cn=x, dc=Test" \
      -Djava.security.policy=java.policy \
      -Djava.naming.security.principal="$principal" \
      -Djava.naming.security.credentials="$credentials" \
      jini.Server &

이 커멘드로,

- Jini 검색 서비스에의 액세스를 가능하게 하는, 시큐리티 정책가 지정되고 있습니다.
- 작성되는 에이전트의 이름은 `test-server-c` 입니다. 서비스 URL 는, RMI over JRMP 로서 선택되는 연결기를 지정합니다. RMI 연결기 Stub가 보존되는 외부 디렉토리는,「4.1 초기설정」 으로 `jndildap` 로서 특정한 LDAP 서버입니다.
- Stub는 LDAP 서버의 `Test` 도메인 컴퍼넌트에 등록됩니다.
- LDAP 서버에 액세스 하기 위한(해), 공통명의 속성 `principal` 와 패스워드 `credentials` 가 지정됩니다.

`Server` 가 기동하면(자), RMI 연결기의 작성, 및 그 URL 가 에이전트명 `test-server-c` 로 Jini 검색 서비스에 등록되는 것을 확인하는 메세지가 표시됩니다.

4. 외부 디렉토리를 사용하지 않는 IIOP 상의 RMI 연결기

다음의 커멘드를 입력해 `Server` 를 기동합니다.

    $ java -classpath . :$classp -Ddebug=true \
      -Dagent.name=test-server-d \
      -Durl="service:jmx:iiop://" \
      -Djava.security.policy=java.policy \
      jini.Server &

이 커멘드로,

- Jini 검색 서비스에의 액세스를 가능하게 하는, 시큐리티 정책가 지정되고 있습니다.
- 작성되는 에이전트의 이름은 `test-server-d` 입니다.
- 서비스 URL 는, IIOP 상의 RMI 연결기로서 선택되는 연결기를 지정합니다.

`Server` 가 기동하면(자), RMI 연결기의 작성, 및 자동적으로 생성된 URL 의 Jini 검색 서비스에의 등록을 확인하는 메세지가 표시됩니다.

5. IIOP 상의 RMI 연결기. 외부 디렉토리에 CORBA 를 사용합니다.

다음의 커멘드를 입력해 `Server` 를 기동합니다.

    $ java -classpath . :$classp -Ddebug=true \
      -Dagent.name=test-server-e \
      -Durl="service:jmx:iiop:///jndi/${jndiiiop}/server" \
      -Djava.security.policy=java.policy \
      jini.Server &

이 커멘드로,

- Jini 검색 서비스에의 액세스를 가능하게 하는, 시큐리티 정책가 지정되고 있습니다.
- 작성되는 에이전트의 이름은 `test-server-e` 입니다.
- 서비스 URL 는, IIOP 상의 RMI 연결기로서 선택되는 연결기를 지정합니다. RMI 연결기 Stub `server` 가 보존되는 외부 디렉토리는,「4.1 초기설정」 으로 `jndiiiop` 와 특정한 CORBA 네임 서비스입니다.

`Server` 가 기동하면(자), RMI 연결기의 작성, 및 그 URL 가 `test-server-e` 의 이름으로 Jini 검색 서비스에 등록되는 것을 확인하는 메세지가 표시됩니다.

6. IIOP 상의 RMI 연결기. 외부 디렉토리에 LDAP 를 사용합니다.

다음의 커멘드를 입력해 Server 를 기동합니다.

    $ java -classpath . :$classp -Ddebug=true \
      -Dagent.name=test-server-f \
      -Durl="service:jmx:iiop:///jndi/${jndildap}/cn=x, dc=Test" \
      -Djava.security.policy=java.policy \
      -Djava.naming.security.principal="$principal" \
      -Djava.naming.security.credentials="$credentials" \
      jini.Server &

이 커멘드로,

- Jini 검색 서비스에의 액세스를 가능하게 하는, 시큐리티 정책가 지정되고 있습니다.
- 작성되는 에이전트의 이름은 `test-server-f` 입니다.
- 서비스 URL 는, RMI over IIOP 로서 선택되는 연결기를 지정합니다.
- RMI 연결기 Stub가 보존되는 외부 디렉토리는,「4.1 초기설정」 으로 `jndildap` 와 특정한 LDAP 서버입니다.
- Stub는 LDAP 서버의 `Test` 도메인 컴퍼넌트에 등록됩니다.
- LDAP 서버에 액세스 하기 위한(해), 공통명의 속성 `principal` 와 패스워드 `credentials` 가 지정됩니다.

`Server` 가 기동하면(자), RMI 연결기의 작성, 및 그 URL 가 에이전트명 `test-server-f` 로 Jini 검색 서비스에 등록되는 것을 확인하는 메세지가 표시됩니다.

2. `Client` 를 기동합니다.

선택한 트랜스폴트 및 외부 디렉토리를 사용해 `Server` 를 기동한 후,`Client` 를 기동합니다.

    $ java -classpath . :$classp -Ddebug=true \
      -Djava.security.policy=java.policy \
      jini.Client

`Server` 로 작성되고 검색 서비스에 등록된 에이전트의 검출을 확인하는 출력이 표시됩니다. 또, 에이전트로 설정된 접속의 접속명과 접속의 확인이 표시됩니다.

다음의 커멘드를 입력하면(자), 특정의 에이전트를 검색할 수 있습니다.

    $ java -classpath . :$classp -Ddebug=true \
      -Djava.security.policy=java.policy \
      -Dagent.name=agentName \
      jini.Client

상기의 커멘드로, agentName 는 검색하는 에이전트의 이름입니다. 또,`*` 를 사용해 에이전트명을 부분적으로 지정할 수도 있습니다. 예를 들어, 문자 `x` 로 시작되는 모든 에이전트명을 검색하는 경우는,`x*` 와 지정합니다.

## 4.4 Java Naming and Directory Interface (JNDI) /LDAP 검색 서비스

JMX 테크놀러지에서는, LDAP 레지스트리를 연구 최종 단계로서 사용해, JNDI 검색 서비스에 RMI 연결기를 등록할 수 있습니다. 이 예에서는, 다음의 조작을 실행합니다.

1. 에이전트측:

1. MBean 서버를 작성
2. 연결기 서버를 작성
3. LDAP 서버에 연결기 주소를 등록

2. 클라이언트측:

1. JNDI/LDAP 검색 서비스의 포인터를 취득
2. JNDI/LDAP 검색 서비스에 등록된 모든 연결기 서버를 검색
3. JMX Remote API 연결기를 작성
4. MBean 서버의 MBean 에 관한 정보를 취득

JNDI/LDAP 검색의 예는, 디렉토리 work_dir`/jmx_examples/Lookup/ldap` 내에 있습니다.

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

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

- `Server.java`
- `Client.java`
- `jmx-schema.txt`
- `60jmx-schema.ldif`
- `README`

2. 텍스트 문자 편집기로 파일을 엽니다.

이러한 클래스에 도착해, 이후의 섹션으로 분석합니다.

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

다음의 섹션에서는, JNDI/LDAP 검색 서비스의 예제로 사용되는 각 클래스를 분석해, 각 클래스가 상기로 설명한 조작을 어떻게 실행할까에 임해서 설명합니다.

#### 4.4. 1.1 Server.java

JNDI/LDAP 검색 서비스의 `Server.java` 클래스는, 그 크기에 의해, 일련의 코드예로서 나타나고 있습니다.

코드예 4-12 JNDI/LDAP 검색 서비스의 예제 클래스 Server.java (발췌 1)

    [...]

    public class Server {
       public final static int JMX_DEFAULT_LEASE = 60;
       private static boolean debug = false;
       private final MBeanServer mbs;
       public Server() {
          mbs = MBeanServerFactory.createMBeanServer();
       }

      public static DirContext getRootContext() throws NamingException {
          final Hashtable env = new Hashtable();

          final String factory =
            System.getProperty(Context.INITIAL_CONTEXT_FACTORY,
                               "com.sun.jndi.ldap.LdapCtxFactory");
          final String ldapServerUrl =
            System.getProperty(Context.PROVIDER_URL);
          final String ldapUser =
            System.getProperty(Context.SECURITY_PRINCIPAL,
                               "cn=Directory Manager");
          final String ldapPasswd =
            System.getProperty(Context.SECURITY_CREDENTIALS);
          debug(Context.PROVIDER_URL + "=" + ldapServerUrl);
          debug(Context.SECURITY_PRINCIPAL + "=" + ldapUser);
          if (debug) {
                      System.out.print(Context.SECURITY_CREDENTIALS + "=");
                      final int len = (ldapPasswd==null)? 0:ldapPasswd.length();
                      for (int i=0;i<len;i++) System.out.print("*");
                      System.out.println();
          }
          env.put(Context.INITIAL_CONTEXT_FACTORY, factory);
          env.put(Context.SECURITY_PRINCIPAL, ldapUser);
          if (ldapServerUrl ! = null)
               env.put(Context.PROVIDER_URL, ldapServerUrl);
          if (ldapPasswd ! = null)
               env.put(Context.SECURITY_CREDENTIALS, ldapPasswd);
          InitialContext root = new InitialLdapContext(env, null);
          return (DirContext)(root.lookup(""));
      }

    [...]

코드예 4-12 에, MBean 서버 `mbs` 의 초기 작성, 및 연결기 서버의 주소가 등록되는 LDAP 디렉토리 트리의 루트 문맥의 포인터의 취득을 나타냅니다. 프로바이더 URL, LDAP 사용자명, 시큐리티 자격등의 관련하는 LDAP 액세스 변수는 모두 여기로 지정되어 환경 맵 `env` 에게 건네집니다. 환경 맵 `env` 는, 이 후,`InitialLdapContext` 의 호출에 파라미터로서 건네받아 이것에 의해 초기 LDAP 문맥이 취득됩니다.

코드예 4-12 에서는 생략 되고 있습니다만, 연결기가 LDAP 서버에 등록될 때의 에이전트명이 취득됩니다.

코드예 4-13 JNDI/LDAP 검색 서비스의 예제 클래스 Server.java (발췌 2)

    [...]

    public static void register(DirContext root,
                               JMXServiceURL jmxUrl,
                               String name)
       throws NamingException, IOException {

       final String mydn = System.getProperty("dn", "cn="+name);

       debug("dn: " + mydn );

       Object o = null;
       try {
           o = root.lookup(mydn);
       } catch (NameNotFoundException n) {
           Attributes attrs = new BasicAttributes();
           Attribute objclass = new BasicAttribute("objectClass");
           objclass.add("top");
           objclass.add("javaContainer");
           objclass.add("jmxConnector");
           attrs.put(objclass);
           attrs.put("jmxAgentName", name);
           o = root.createSubcontext(mydn, attrs);
       }
       if (o == null) throw new NameNotFoundException();
       final Attributes attrs = root.getAttributes(mydn);
       final Attribute oc = attrs.get("objectClass");
       if (! oc.contains("jmxConnector")) {
           final String msg = "The supplied node [" + mydn +
             "] does not contain the jmxConnector objectclass";
           throw new NamingException(msg);
       }

       final Attributes newattrs = new BasicAttributes();
       newattrs.put("jmxAgentName", name);
       newattrs.put("jmxServiceURL", jmxUrl.toString());
       newattrs.put("jmxAgentHost", InetAddress.getLocalHost(). getHostName());
       newattrs.put("jmxProtocolType", jmxUrl.getProtocol());
       newattrs.put("jmxExpirationDate",
                    getExpirationDate(JMX_DEFAULT_LEASE));
       root.modifyAttributes(mydn, DirContext.REPLACE_ATTRIBUTE, newattrs);
    }

    [...]

코드예 4-13 에, JMX 연결기 서버의 서비스 URL 의 LDAP 디렉토리에의 등록을 나타냅니다. URL 가 등록되는 DN 는, 커멘드행의 `dn` 시스템 프로퍼티, 즉 `-Ddn=`mydn 를 사용해 건네줄 수가 있습니다 (후술의 서버의 기동에 사용되는 커멘드를 참조). `dn` 시스템 프로퍼티이 지정되지 않는 경우, DN:`cn=`name 를 사용할 수 있습니다. 여기서 name 는 `agentName` 입니다. 무엇보다, 반드시 이것을 사용할 필요는 없습니다. 실제로는 URL 가 등록되는 장소는 문제가 되지 않습니다. 클라이언트 코드로 직접 그 DN 가 사용되는 것이 없기 때문입니다. 그 대신해, LDAP 검색을 실행해, 보조적인 `jmxConnector` `ObjectClass` 를 포함한 노드가 검색됩니다. 여기서 중요하게 되는 것은, 각 URL 가 개개의 LDAP 노드에 등록된다고 하는 점입니다. 이러한 노드의 명명 방식은, LDAP 관리자, 이 경우는 각 사용자가 맡길 수 있습니다. 이 예에서는, 노드 `cn=`name 의 작성이 가능한 `root` 문맥을 작성하는 방법으로 LDAP 서버를 설정해, 이 `root` 문맥을,`Context.PROVIDER_URL` 프로퍼티을 통해서 LDAP 의 초기 문맥에 건네주고 있는 것과 가정하고 있습니다 (코드예 4-12 를 참조).

코드예 4-13 의 코드에서는, 서버 URL 를 등록하는 노드가 존재할지 어떨지를 체크하고 있습니다. 존재하지 않는 경우, 노드의 작성을 시도해 주세요 (친노드가 존재하고 있지 않는 경우는 실패한다). `jmxConnector` `ObjectClass` 는 간단한 보조 클래스이기 (위해)때문에, 새로운 문맥을 작성할 필요가 있는 경우는, 구조화 클래스로서 `javaContainer ObjectClass` 를 사용합니다. 이 경우도, 반드시 이 클래스를 사용할 필요는 없습니다. `jmxConnector` 보조 클래스를 추가할 수 있는 구조화 클래스이면, 뭐든지 괜찮습니다. 코드는 다음에 서버를 등록하는 노드에,`jmxConnector` 보조 클래스가 벌써 사용되고 있는지 어떤지를 체크합니다. 사용되어 있지 않은 경우는, 예외가 throw 됩니다.

이 시점에서, URL 를 등록하는 노드가 존재해, 적절한 `jmxConnector` 보조 클래스가 지정되고 있는 것이 확실히 됩니다. 이 때문에, 나머지는 LDAP 검색을 위한 JMX Remote API 로 정의된 속성의 값을 옮겨놓을 뿐입니다 (`jmx-schema.txt` 를 참조).

- `jmxServiceUrl`:서버의 기동 후에 `server.getAddress()` 에 의해 취득된 `String` 형식의 서버 URL 가 포함된다
- `jmxAgentName`:JMX 에이전트명이 포함된다
- `jmxProtocolType`:`jmxUrl.getProtocolType()` 로 반환되는 JMX 프로토콜형이 포함된다
- `jmxAgentHost`:에이전트 호스트의 이름이 포함된다
- `jmxExpirationDate`:URL 의 유효 기일이 포함된다

코드예 4-14 JNDI/LDAP 검색 서비스의 예제 클래스 Server.java (발췌 3)

    [...]

       public JMXConnectorServer rmi(String url)
         throws IOException, JMException,
            NamingException, ClassNotFoundException {

         JMXServiceURL jurl = new JMXServiceURL(url);
         final HashMap env = new HashMap();
         // Prepare the environment Map

    [...]

         JMXConnectorServer rmis =
            JMXConnectorServerFactory.newJMXConnectorServer(jurl, env, mbs);

         final String agentName = System.getProperty("agent.name",
                                                     "DefaultAgent");
         start(rmis, env, agentName);
         return rmis;
       }

    [...]

코드예 4-14 에서는, JMX 서비스 URL `jurl` 와 적절한 LDAP 프로퍼티이 환경 맵 `env` 에게 건네져`rmis` 라고 하는 새로운 RMI 연결기 서버가 작성되고 있습니다. 연결기 서버 `rmis` 가,`JMXConnectorServer.start()` 의 호출에 의해 기동해, LDAP 서버에 등록됩니다.

코드예 4-15 JNDI/LDAP 검색 서비스의 예제 클래스 Server.java (발췌 4)

    [...]

        public void start(JMXConnectorServer server, Map env, String agentName)
           throws IOException, NamingException {
           server.start();
           final DirContext root=getRootContext();
           final JMXServiceURL address = server.getAddress();
           register(root, address, agentName);
        }

    [...]

코드예 4-15 에, JMX 연결기 서버 `server` 의 작성, LDAP 서버의 루트 디렉토리 `root` 의 포인터의 취득, 및 `address` 라는 이름의 `server` 의 URL 의 작성을 나타냅니다. 루트 디렉토리, URL, 및 에이전트명은, 파라미터로서 `register()` 에게 건네져 LDAP 서버에 등록됩니다.

#### 4.4. 1.2 Client.java

JNDI/LDAP 검색 서비스의 `Client.java` 클래스를코드예 4-16 에 나타냅니다.

코드예 4-16 JNDI/LDAP 검색 서비스 예제 Client.java

    [...]

    public class Client {

       private static boolean debug = false;

       public static void listAttributes(DirContext root, String dn)
         throws NamingException {
         final Attributes attrs = root.getAttributes(dn);
         System.out.println("dn: " + dn);
         System.out.println("attributes: " + attrs);
       }

       public static DirContext getRootContext() throws NamingException {
          final Hashtable env = new Hashtable();
          // Prepare environment map
          [...]

          InitialContext root = new InitialLdapContext(env, null);
          return (DirContext)(root.lookup(""));
       }

       // Confirm URL has not expired
      [...]

       public static List lookup(DirContext root, String protocolType,
                                 String name)
          throws IOException, NamingException {
          final ArrayList list = new ArrayList();
          String queryProtocol =
             (protocolType==null)? "":"(jmxProtocolType="+protocolType+") ";
          String query =
              "(&" + "(objectClass=jmxConnector) " +
              "(jmxServiceURL=*) " +
              queryProtocol +
              "(jmxAgentName=" + ((name! =null)? name:"*") + ")) ";

          SearchControls ctrls = new SearchControls();
          ctrls.setSearchScope(SearchControls.SUBTREE_SCOPE);
          final NamingEnumeration results = root.search("", query, ctrls);
          while (results.hasMore()) {
               final SearchResult r = (SearchResult) results.nextElement();
               debug("Found node: " + r.getName());
               final Attributes attrs = r.getAttributes();
               final Attribute attr = attrs.get("jmxServiceURL");
               if (attr == null) continue;
               final Attribute exp = attrs.get("jmxExpirationDate");
               if ((exp ! = null) && hasExpired((String) exp.get())) {
                   System.out.print(r.getName() + ": ");
                   System.out.println("URL expired since: " + exp.get());
                   continue;
               }
               final String urlStr = (String) attr.get();
               if (urlStr.length() == 0) continue;

               debug("Found URL: "+ urlStr);

               final JMXServiceURL url = new JMXServiceURL(urlStr);
               final JMXConnector conn =
                   JMXConnectorFactory.newJMXConnector(url, null);
               list.add(conn);
               if (debug) listAttributes(root, r.getName());
          }

          return list;

       }
    }

코드예 4-16 에서는,`Client` 는 우선 LDAP 디렉토리 `DirContext` 의 포인터 `root` 를 돌려주어, 다음에 이 디렉토리에서 `jmxConnector` 형의 객체 클래스를 검색합니다. jmxConnector 객체 클래스의 서비스 URL 와 유효 기일 속성,`attr` 와 `exp` 가 취득되어`exp` 의 체크에 의해 URL 가 유효기간내인 것이 확인되어`JMXConnectorFactory` 의 호출에 의해 새로운 연결기 `conn` 가 작성됩니다. 연결기 `conn` 가 연결기의 리스트에 추가되어 MBean 내의 `Server` 로 작성된 MBean 에의 액세스에 사용됩니다.

#### 4.4. 1.3 jmx-schema.txt

`jmx-schema.txt` 파일은, JMX Remote API 용의 LDAP schema 파일입니다.

#### 4.4. 1.4 60jmx-schema.ldif

`60jmx-schema.ldif` 파일은, JMX 테크놀러지의 LDAP schema 파일 `jmx-schema.txt` 에 대응하는 `ldif` 파일입니다. Sun ONE Directory Server 를 사용하고 있는 경우, 이 파일을 Sun ONE Directory Server 의 `config/schema` 디렉토리에 직접 카피할 수 있습니다 (「4.4. 2.1 JNDI/LDAP 검색 서비스의 예제의 설정」 을 참조).

### 4.4. 2 JNDI/LDAP 검색 서빌의 예제의 실행

JNDI/LDAP 검색 서비스를 사용하는 검색 서비스의 예제를 실행하려면 ,「4.1 초기설정」 으로 실행한 작업 외에도, 이 예제에 고유의 초기 작업을 사전에 실행할 필요가 있습니다. JNDI/LDAP 네트워크 테크놀러지를, JMX 테크놀러지로 지원되는 2 개의 연결기와 함께 사용해 연결기의 검색을 개시할 수 있습니다.

예제를 실행하는 경우, 작성된 에이전트의 종류와 에이전트의 작성에 사용된 트랜스폴트를 추적하기 위해서, 대응하는 섹션의 캐릭터 라인에 동일한 문자 사픽스가 에이전트명에 포함되어 있습니다. 예를 들어,「Section a. 외부 디렉토리를 사용하지 않는 JRMP 상의 RMI 연결기」 의 에이전트는 `test-server-a` 라는 이름이 붙일 수 있습니다.

#### 4.4. 2.1 JNDI/LDAP 검색 서빌의 예제의 설정

다음의 순서는, 이 예제로 실행할 수 있는 각종의 연결기/트랜스폴트의 모든 편성으로 요구됩니다.

1. 「4.1 초기설정」 으로 기동한 LDAP 서버를 정지합니다.

이것은 사용하고 있는 LDAP 서버의 종류에 맞추어 실행합니다.

2. JMX 테크놀러지의 schema를, 사용하고 있는 LDAP 서버의 `schema` 디렉토리에 카피합니다.

예를 들어, Sun ONE Directory Server 5.0 을 사용하고 있는 경우, 다음과 같이 입력합니다.

`$` cp 60jmx-schema.ldif /var/ds5/slapd-<hostname>/config/schema

그 외의 LDAP 서버에 대해서는, 사용의 LDAP 서버의 종류에 맞추어 실행합니다.

3. LDAP 서버를 재기동합니다.

이것은 사용하고 있는 LDAP 서버의 종류에 맞추어 실행합니다.

4. `Server` 가 그 서비스 URL 를 등록하는 루트를 정의합니다.

`Server` 에 「4.1 초기설정」 으로 작성한 도메인 컴퍼넌트의 사픽스 `dc=Test` 의 패스를 지정할 필요가 있습니다.

`$` provider="ldap://$ldaphost:$ldapport/dc=Test"

5. `Client` 클래스와 `Server` 클래스를 컴파일 합니다.

`$` javac -d . Server.java Client.java

#### 4.4. 2.2 RMI 연결기를 사용한 JNDI/LDAP 검색 서비스의 예제의 실행

이 예에서는, JNDI/LDAP 검색 서비스를 사용해, RMI 의 디폴트의 트랜스폴트인 JRMP, 및 IIOP 트랜스폴트를 사용하는 RMI 연결기 서버를 검색하는 방법을 나타냅니다. 그 외 ,「4.1 초기설정」 으로 설명한 것처럼, RMI 연결기 Stub의 등록에는 다른 외부 디렉토리가 사용되고 있습니다.

여기에 나타내는 트랜스폴트와 외부 디렉토리의 편성은 다음과 같습니다.

- 다음의 것을 사용한, JRMP 트랜스폴트상의 RMI 연결기

- 외부 디렉토리 없음
- RMI 레지스트리
- LDAP 레지스트리

- 다음의 것을 사용한, IIOP 트랜스폴트상의 RMI 연결기

- 외부 디렉토리 없음
- CORBA 네임 서비스
- LDAP 레지스트리

1. `Server` 를 기동합니다.

`Server` 의 기동에 사용하는 커멘드는, 사용하고 있는 외부 디렉토리에 의해 다릅니다. `Client` 를 기동하기 전에, 각종의 트랜스폴트 및 외부 레지스트리를 사용해,`Server` 의 다음의 인스턴스의 1 개 또는 복수를 기동할 수 있습니다.

1. 외부 디렉토리를 사용하지 않는 JRMP 상의 RMI 연결기

다음의 커멘드를 입력해 `Server` 를 기동합니다.

    $ java -classpath .  -Ddebug=true \
      -Dagent.name=test-server-a \
      -Durl="service:jmx:rmi://" \
      -Djava.naming.provider.url="$provider" \
      -Djava.naming.security.principal="$principal" \
      -Djava.naming.security.credentials="$credentials" \
      jndi.Server &

이 커멘드로,

- `debug` 는 true 로 설정되어`Server` 의 실행시의 화면 출력을 보다 상세한 것으로 합니다.
- 작성되는 에이전트의 이름은 `test-server-a` 입니다.
- 에이전트가 등록되는 도메인 컴퍼넌트의 사픽스를 나타내는 URL,`provider` 가 지정됩니다.
- LDAP 서버에 액세스 하기 위한(해), 공통명의 속성 `principal` 와 패스워드 `credentials` 가 지정됩니다.
- 서비스 URL 에 의해, RMI 의 디폴트 트랜스폴트 JRMP 상에서 동작하는 RMI 연결기의 선택이 지정됩니다.

서버가 기동하면(자), RMI 연결기의 작성, 및 그 URL 의 JNDI/LDAP 검색 서비스에의 등록을 확인하는 메세지가 표시됩니다.

2. JRMP 상의 RMI 연결기. 외부 디렉토리에 RMI 레지스트리를 사용합니다.

다음의 커멘드를 입력해 `Server` 를 기동합니다.

    $ java -classpath .  -Ddebug=true \
      -Dagent.name=test-server-b \
      -Durl="service:jmx:rmi:///jndi/${jndirmi}/server" \
      -Djava.naming.provider.url="$provider" \
      -Djava.naming.security.principal="$principal" \
      -Djava.naming.security.credentials="$credentials" \
      jndi.Server &

이 커멘드로,

- 작성되는 에이전트의 이름은 `test-server-b` 입니다.
- 에이전트가 등록되는 도메인 컴퍼넌트의 사픽스를 나타내는 URL,`provider` 가 지정됩니다.
- LDAP 서버에 액세스 하기 위한(해), 공통명의 속성 `principal` 와 패스워드 `credentials` 가 지정됩니다.
- 서비스 URL 는, RMI over JRMP 로서 선택되는 연결기를 지정합니다. RMI 연결기 Stub `server` 가 보존되는 외부 디렉토리는,「4.1 초기설정」 으로 `jndirmi` 로서 특정한 RMI 레지스트리입니다.

`Server` 가 기동하면(자), RMI 연결기의 작성, 및 그 URL 의 JNDI/LDAP 검색 서비스에의 등록을 확인하는 메세지가 표시됩니다.

3. JRMP 상의 RMI 연결기. 외부 디렉토리에 LDAP 를 사용합니다.

다음의 커멘드를 입력해 `Server` 를 기동합니다.

    $ java -classpath .  -Ddebug=true \
      -Dagent.name=test-server-c \
      -Durl="service:jmx:rmi:///jndi/${jndildap}/cn=x, dc=Test" \
      -Djava.naming.provider.url="$provider" \
      -Djava.naming.security.principal="$principal" \
      -Djava.naming.security.credentials="$credentials" \
      jndi.Server &

이 커멘드로,

- 작성되는 에이전트의 이름은 `test-server-c` 입니다.
- 에이전트가 등록되는 도메인 컴퍼넌트의 사픽스를 나타내는 URL,`provider` 가 지정됩니다.
- LDAP 서버에 액세스 하기 위한(해), 공통명의 속성 `principal` 와 패스워드 `credentials` 가 지정됩니다.
- 서비스 URL 는, RMI over JRMP 로서 선택되는 연결기를 지정합니다. RMI 연결기 Stub가 보존되는 외부 디렉토리는,「4.1 초기설정」 으로 `jndildap` 와 특정한 LDAP 서버입니다.

`Server` 가 기동하면(자), RMI 연결기의 작성, 및 그 URL 가 에이전트명 `test-server-c` 로 JNDI/LDAP 검색 서비스에 등록되는 것을 확인하는 메세지가 표시됩니다.

4. 외부 디렉토리를 사용하지 않는 IIOP 상의 RMI 연결기

다음의 커멘드를 입력해 `Server` 를 기동합니다.

    $ java -classpath .  -Ddebug=true \
      -Dagent.name=test-server-d \
      -Durl="service:jmx:iiop://" \
      -Djava.naming.provider.url="$provider" \
      -Djava.naming.security.principal="$principal" \
      -Djava.naming.security.credentials="$credentials" \
      jndi.Server &

이 커멘드로,

- 작성되는 에이전트의 이름은 `test-server-d` 입니다.
- 에이전트가 등록되는 도메인 컴퍼넌트의 사픽스를 나타내는 URL,`provider` 가 지정됩니다.
- LDAP 서버에 액세스 하기 위한(해), 공통명의 속성 `principal` 와 패스워드 `credentials` 가 지정됩니다.
- 서비스 URL 는, 선택되는 연결기가 IIOP 상에서 동작하는 RMI 연결기인 것을 지정합니다.

`Server` 가 기동하면(자), RMI 연결기의 작성, 및 자동적으로 생성된 URL 의 JNDI/LDAP 검색 서비스에의 등록을 확인하는 메세지가 표시됩니다.

5. IIOP 상의 RMI 연결기. 외부 디렉토리에 CORBA 를 사용합니다.

다음의 커멘드를 입력해 `Server` 를 기동합니다.

    $ java -classpath .  -Ddebug=true \
      -Dagent.name=test-server-e \
      -Durl="service:jmx:iiop:///jndi/${jndiiiop}/server" \
      -Djava.naming.provider.url="$provider" \
      -Djava.naming.security.principal="$principal" \
      -Djava.naming.security.credentials="$credentials" \
      jndi.Server &

이 커멘드로,

- 작성되는 에이전트의 이름은 `test-server-e` 입니다.
- 에이전트가 등록되는 도메인 컴퍼넌트의 사픽스를 나타내는 URL,`provider` 가 지정됩니다.
- LDAP 서버에 액세스 하기 위한(해), 공통명의 속성 `principal` 와 패스워드 `credentials` 가 지정됩니다.
- 서비스 URL 는, IIOP 상의 RMI 연결기로서 선택되는 연결기를 지정합니다. RMI 연결기 Stub server 가 보존되는 외부 디렉토리는,「4.1 초기설정」 으로 `jndiiiop` 로서 특정한 CORBA 네임 서비스입니다.

`Server` 가 기동하면(자), RMI 연결기의 작성, 및 그 URL 가 `test-server-e` 의 이름으로 JNDI/LDAP 검색 서비스에 등록되는 것을 확인하는 메세지가 표시됩니다.

6. IIOP 상의 RMI 연결기. 외부 디렉토리에 LDAP 를 사용합니다.

다음의 커멘드를 입력해 `Server` 를 기동합니다.

    $ java -classpath .  -Ddebug=true \
      -Dagent.name=test-server-f \
      -Durl="service:jmx:iiop:///jndi/${jndildap}/cn=x, dc=Test" \
      -Djava.naming.provider.url="$provider" \
      -Djava.naming.security.principal="$principal" \
      -Djava.naming.security.credentials="$credentials" \
      jndi.Server &

이 커멘드로,

- 작성되는 에이전트의 이름은 `test-server-f` 입니다.
- 에이전트가 등록되는 도메인 컴퍼넌트의 사픽스를 나타내는 URL,`provider` 가 지정됩니다.
- LDAP 서버에 액세스 하기 위한(해), 공통명의 속성 `principal` 와 패스워드 `credentials` 가 지정됩니다.
- 서비스 URL 는, 선택된 연결기를 RMI over IIOP 로서 지정합니다. RMI 연결기 Stub가 보존되는 외부 디렉토리는,「4.1 초기설정」 으로 `jndildap` 와 특정한 LDAP 서버입니다.

`Server` 가 기동하면(자), RMI 연결기의 작성, 및 그 URL 가 에이전트명 `test-server-f` 로 JNDI/LDAP 검색 서비스에 등록되는 것을 확인하는 메세지가 표시됩니다.

2. `Client` 를 기동합니다.

선택한 트랜스폴트 및 외부 디렉토리를 사용해 `Server` 를 기동한 후,`Client` 를 기동합니다.

    $ java -classpath .  -Ddebug=true \
      -Djava.naming.provider.url="$provider" \
      -Djava.naming.security.principal="$principal" \
      -Djava.naming.security.credentials="$credentials" \
      jndi.Client

`Server` 로 작성되고 검색 서비스에 등록된 에이전트의 검출을 확인하는 출력이 표시됩니다. 또, 에이전트로 설정된 접속의 접속명과 접속의 확인이 표시됩니다.

특정의 에이전트를 검색하려면 , 다음의 커멘드를 입력합니다.

    $ java -classpath .  -Ddebug=true \
      -Djava.naming.provider.url="$provider" \
      -Djava.naming.security.principal="$principal" \
      -Djava.naming.security.credentials="$credentials" \
      -Dagent.name=agentName \
      jndi.Client

상기의 커멘드로, agentName 는 검색하는 에이전트의 이름입니다. 또,* 를 사용해 에이전트명을 부분적으로 지정할 수도 있습니다. 예를 들어, 문자 x 로 시작되는 모든 에이전트명을 검색하는 경우는, x* 와 지정합니다.

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

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