Java IDL:Interoperable Naming Service (INS)의 예 - xrath.com 에서 번역됨

# Java IDL:Interoperable Naming Service (INS)의 예

Interoperable Naming Service (INS)는,`CosNaming` 서비스의 확장 기능입니다. INS 에는 다음과 같은 기능이 추가되고 있습니다.

- 캐릭터 라인화한 이름으로 해결하는 기능 (Department/Accounting/TravelExpenses 등)
- CORBA 객체 참조용 URL (corbaloc: 및 corbaname: 형식)
- CosName 및 URL 를 취급하기 위한 편리한 `NamingContextExt` 의 API
- bootstrap용의 ORB 인수 (`ORBInitRef` 및 `ORBDefaultInitRef`)

다음의 그림은, INS 가 어떻게 ORBD 에 적합하는지를 나타내고 있습니다.

객체 참조는, 적어도, 주소, 객체 참조를 작성한 POA 의 이름, 및 객체 ID 라고 하는 3 개의 정보를 포함하고 있습니다.

INS 를 사용하면(자), 캐릭터 라인화 된 Interoperable Object References (IOR)보다 읽기 쉬운, CORBA 객체에 액세스하기 위한 URL 를 제공할 수 있습니다. 다음과 같은 캐릭터 라인화 된 객체 참조 형식을 사용할 수 있습니다.

- Interoperable Object References (IOR)

  IOR 는, 객체 참조이며, OMG 에 의해 정의된 GIOP (General Inter-ORB Protocol)나 IIOP (Internet Inter-ORB Protocol)를 사용해 정보를 교환하는 ORB 에 의해 인식됩니다. 클라이언트는,「이름 공간의 브라우즈」의 예에 나타내도록(듯이),`orb.object_to_string(objRef)` 를 사용해 객체 참조를 취득하는지, 또는 다른 객체 참조의 기동의 결과로서, 객체 참조를 가져옵니다.

- 인간이 읽을 수 있는 URL 형식의 CORBA 객체 참조

  `corbaloc` 와 `corbaname` 의 형식을 사용하면(자), CORBA 객체에 액세스하기 위한 URL 를 제공할 수 있습니다. `corbaloc` 형식은, 네임 서비스를 경유하지 않고, 특정의 CORBA 서비스를 해결하는 경우에 사용합니다. `corbaname` 형식은, 특정의 네이밍 문맥의 캐릭터 라인화 된 이름을 해결하는 경우에 사용합니다.

  - corbaloc:

    `corbaloc:`형식은, CORBA 클라이언트에 있어 유효한 형식에서, CORBA 서비스를 찾기 위해서(때문에) 사용됩니다. 이 형식은, 일반적으로, GIOP 의 `LocateRequest` 메세지 또는 `Request` 메세지를 사용해, 참조를 해결하기 위해서 사용됩니다. 예를 들어,`corbaloc:` 객체 참조는 다음과 같이 지정합니다.

         	corbaloc:iiop:1. 2@MyBank.com:2050/TraderService

    이 예는, 호스트 `myBank.com` 의 포트 `2050` 으로부터 `TraderService` 의 객체 참조를 취득하는 방법을 나타내고 있습니다.

    주: URL 의 예의 1.2 는,`corbaloc` URL 에 대응하는 IOR 의 GIOP 버젼 1.2 를 의미합니다. GIOP 1.2 는, Sun 의 Java CORBA ORB 의 디폴트 값입니다. 이 예에서는, 다른 버젼을 관련짓는 방법을 나타내기 위해서(때문에) 사용되고 있습니다.

  - corbaname:

    `corbaname:`형식은, 클라이언트가 직접 bootstrap하기 위한 기구를 제공해서 , 일반적으로, 루트 네이밍 문맥의 캐릭터 라인화 된 이름을 해결하기 위해서 사용됩니다. 예를 들어,`corbaname:` 객체 참조는 다음과 같이 지정합니다.

         	corbaname::myBank.com:2050#Personal/schedule

    `myBank.com` 는 호스트로,`2050` 은 포트입니다. 해시 마크까지의 부분의 참조 (`corbaname::myBank.com:2050` )는, 루트 네이밍 문맥을 돌려주는 URL 입니다. 이 예는, a) 네임 서비스를 찾아, b) 네임 서비스의 `Personal/schedule` 라는 이름을 해결하기 위해서 사용되는 URL 를 나타내고 있습니다.

#### `NamingContextExt` API

`NamingContext` 로부터 파생한 `NamingContextExt` 인터페이스는, URL 와 캐릭터 라인화 된 이름을 사용하기 위해서 필요한 조작을 제공합니다. CosName, 캐릭터 라인화 된 이름, 및 URL 간의 변환에 사용하는 `NamingContextExt` API 를 몇개인가다음에 나타냅니다. 이러한 API 의 상세한 것에 대하여는,COS Naming Specification 의 3.6. 4 절을 참조해 주세요.

- `to_string`

  이 오퍼레이션은,`Name` 를 받아, 캐릭터 라인화 된 이름을 돌려줍니다. `Name` 가 무효인 경우는,`InvalidName` 예외가 발생합니다.

- `to_name`

  이 오퍼레이션은, 캐릭터 라인화 된 이름을 받아,`Name` 를 돌려줍니다. 캐릭터 라인화 된 이름이, 구문적으로 잘못되어 있는지, 또는 구현의 제한으로 적합하지 않은 경우는,`InvalidName` 예외가 발생합니다.

- `resolve_str`

  `NamingContext.resolve()` 와 같은 방법으로 해결을 실행하는 편리한 오퍼레이션입니다. 이 오퍼레이션은,`Name` 는 아니고, 캐릭터 라인화 된 이름을 인수로서 받습니다.

- `to_url`

  이 오퍼레이션은, 다음과 같은 corbaloc URL <address> and <`key_string`> 컴퍼넌트를 최초의 파라미터로서 취합니다.

  - `:myhost. 555xyz.com`
  - `:myhost. 555xyz.com/a/b/c`
  - `atm:00002112...,:myhost.xyz.com/a/b/c`

  게다가 2 번째의 파라미터로서 캐릭터 라인화 된 이름을 취합니다. 이 오퍼레이션은, 파라미터상의 필요한 이스케이프를 모두 실행해, 완전한 형식의 URL 캐릭터 라인을 돌려줍니다. corbaloc 주소, 키파라미터, 이름 파라미터의 어떤 것인가에 실수가 있으면(자), 예외가 발생합니다.

  stringified_name 는 비울 수도 있습니다. 주소가 빈 상태(empty)의 경우는,`InvalidAddress` 예외가 발생합니다.

URL 로부터 객체에의 변환은, CORBA 2.3 스펙의 13.6. 6 절에 기재되어 있도록(듯이),`org.omg.CORBA.ORB.string_to_object()` 에 의해 처리됩니다.

이하의 Java IDL 튜토리얼에서는,`NamingContextExt` 를 사용합니다.

- Java IDL: 「Hello World」의 예 (POA와 일시 서버의 사용)
- Java IDL: 「Hello World의 예」 (POA, 지속 서버, 및 지속 네임 서비스의 사용)
- Java IDL: 「Hellow World」의 예 (POA-Tie 서버측 모델의 사용)

#### ORB 의 bootstrap option

`ORBInitRef` 또는 `ORBDefaultInitRef` 를 사용해,`resolve_initial_references()` 로부터 커스터마이즈 된 CORBA 서비스의 핸들을 돌려주도록(듯이) ORB 를 구성할 수가 있습니다. 다음에 예를 나타냅니다.

- 예를 들어 다음과 같이 `-ORBInitRef` 를 사용해, 특정의 CORBA 서비스에 해결됩니다.

      -ORBInitRef TraderService=corbaloc::myBank.com:2050/TraderService

- `-ORBInitRef` 를 지정하지 않는 경우는,`-ORBDefaultInitRef` 를 사용해 해결됩니다. 예를 들어,`TraderService` 의 예에서는 다음과 같이 지정합니다.

      -ORBDefaultInitRef corbaloc:iiop:1. 2:myBank.com:2050

이러한 옵션을 사용했을 경우, 해결의 차례는 다음과 같이 됩니다.

1. `register_initial_references` 를 사용해 등록된 객체
2. `-ORBInitRef`
3. `-ORBDefaultInitRef`
4. 독자적인 bootstrap (Sun ORB 마셔)

INS 의 상세한 것에 대하여는, OMG 스펙 (ptc/00-08-07 )을 참조해 주세요.

# INS 의 예:INS URL 에 의해 액세스 되는 참조의 공개

이 문서에서는, Interoperable Naming Service (INS)를 사용해 완전한 CORBA (Common Object Request Broker Architecture) 어플리케이션을 작성하는 방법의 고레벨인 개요에 대해 설명합니다.

이 예에서는, 이하의 파일을 사용합니다.

- 이 예의 단순한 인터페이스의 IDL
- 객체를 작성해, INS URL 로 사용할 수 있도록(듯이) 그 객체를 공개하는서버
- `Service` 인터페이스의구현
- `corbaloc:` URL 를 사용해 서버로부터 참조를 취득하는어플리케이션 클라이언트
- 샘플의 컴파일 방법과 실행 방법에 대한설명

튜토리얼의 각 스텝은 이 기호로 가리킵니다.

## 인터페이스의 정의 (`Service.idl`)

CORBA 어플리케이션 작성의 제일 단계는, OMG 의 인터페이스 정의 언어 (IDL)를 사용해, 객체와 인터페이스를 모두 기술하는 것입니다.

다음의 코드는 OMG IDL 로 기술된 것으로, CORBA 객체의 `ping()` 오퍼레이션이 INS `Service` 에 대한 ping 를 실행하고 있습니다.

`Service.idl` 파일을 작성해, 다음의 코드를 추가합니다.

Service.idl

    // A very simple interface to explain this example
    interface Service {
        void ping();
    };

## 서버의 구현 (`INSServer.java`)

`INSServer` 클래스에는 서버의 `main()` 메소드가 포함됩니다. 이 `main()` 메소드에서는, 다음의 처리를 실시합니다.

- INS 요구를 대기하는 포트를 열기 위한 `ORBPeristentServerPort` 프로퍼티 (Sun 독자적인 프로퍼티)을 설정한다
- ORB 의 인스턴스를 생성해 초기화한다
- 루트 POA 의 참조를 취득해,`POAManager` 를 기동한다
- 서번트를 작성한다 (1 개의 CORBA `ServiceImpl` 객체의 구현)
- 새로운 객체를 「PingService」라고 하는 이름으로 네이밍 문맥에 등록한다
- 클라이언트로부터 새로운 객체가 불려 가는 것을 기다린다

`INSServer.java` 파일을 작성해, 다음의 코드를 추가합니다.

INSServer.java

    // INSServer.java
    // Copyright and License
    import java.util.Properties;
    import org.omg.CORBA.Object;
    import org.omg.CORBA.ORB;
    import org.omg.CORBA.Policy;
    import org.omg.PortableServer.POA;
    import org.omg.PortableServer. *;
    import org.omg.PortableServer.Servant;

    public class INSServer {
        public static void main( String args[] ) {
            try {
                Properties properties = System.getProperties( );
                // STEP 1: Set ORBPeristentServerPort property
                // Set the proprietary property to open up a port to listen to
                // INS requests.
                // Note: This property is subject to change in future releases
                properties.put( "com.sun.CORBA.POA.ORBPersistentServerPort",
                    Integer.toString(1060) );

                // STEP 2: Instantiate the ORB, By passing in the
                // ORBPersistentServerPort property set in the previous step
                ORB orb = ORB.init( args, properties );

                // STEP 3: Instantiate the Service Object that needs to be published
                // and associate it with RootPOA.
                ServiceImpl servant = new ServiceImpl( );
                POA rootPOA = POAHelper.narrow( orb.resolve_initial_references( "RootPOA" ));
                rootPOA.the_POAManager(). activate();
                rootPOA.activate_object( servant );

                // STEP 4: Publish the INS Service using
                // orb.register_initial_reference( <ObjectKey>, <ObjectReference>
                // NOTE: Sun private internal API, not part of CORBA 2.3. 1.
                // May move as our compliance with OMG standards evolves.
                ((com.sun.corba.se.internal.Interceptors.PIORB) orb).
                    register_initial_reference(
                    "PingService", rootPOA.servant_to_reference(servant) );

                System.out.println( "INS Server is Ready..." );

                // STEP 5: We are ready to receive requests
                orb.run( );
            } catch ( Exception e ) {
                 System.err.println( "Error in setup : " + e );
            }
        }
    }

## 서비스의 구현 (`ServiceImpl.java`)

구현예 `ServiceImpl` 에서는,`Service` IDL 인터페이스를 구현합니다.

`ServiceImpl.java` 파일을 작성해, 다음의 코드를 추가합니다.

ServiceImpl.java

    // ServiceImpl.java
    // Copyright and License

    // Implementation of Service interface
    public class ServiceImpl extends ServicePOA {
        public void ping( ) {
            System.out.println( "PingService.ping called..." );
        }
    }

## 클라이언트 어플리케이션의 구현 (`INSClient.java`)

이 어플리케이션 클라이언트에서는, 다음의 처리를 실시합니다.

- ORB 를 생성해 초기화한다
- `resolve_initial_references()` 를 사용해,`PingService` 객체 참조를 취득한다
- `PingService` 의 `ping()` 오퍼레이션을 호출해, 결과를 표시한다

`INSClient.java` 파일을 작성해, 다음의 코드를 추가합니다.

INSClient.java

    // INSClient.java
    // Copyright and License

    import org.omg.CORBA.ORB;

    public class INSClient {
        public static void main( String args[] ) {
            try {
                // STEP 1: Instantiate the ORB
                ORB orb = ORB.init( args, null );

                // STEP 2: Resolve PingService using orb.resolve_initial_references()
                // In this example we have used -ORBInitRef  argument to locate the
                // PingService.  User can also choose to pass the corbaloc: url to
                // orb.string_to_object to resolve the published PingService
                // reference.
                org.omg.CORBA.Object object = orb.resolve_initial_references(
                    "PingService" );

                // STEP 3: Narrow the reference and we are ready to invoke method
                // on PingService.
                Service insService = ServiceHelper.narrow( object );

                insService.ping( );
                System.out.println( "The server has been pinged" );

            } catch ( Exception e ) {
                System.err.println( "Exception in INSClient " + e );
                e.printStackTrace( );
            }
        }
    }

## INS 구축 방법과 실행 방법의 예

이 예를 실행하는 경우는, 1024 이상의 포트 번호를 사용하는 것을 추천합니다. 이것은, Solaris 를 사용하는 경우, 1024 보다 작은 포트 번호로 프로세스를 기동할 경우에, root 로서 액세스 할 필요가 있기 (위해)때문에입니다. 이 예에서는, 서버의 `ORBPersistentServerPort` 프로퍼티을 1060 으로 설정해 있습니다.

### 인터페이스 정의의 컴파일

`Service.idl` 파일이 놓여져 있는 디렉토리로 이동해, 다음과 같이 IDL-to-Java 컴파일러를 실행합니다.

      idlj -fall  Service.idl

`idlj` 컴파일러의 `-fall` 옵션을 사용해, 클라이언트와 서버측의 바인딩의 양쪽 모두를 생성할 필요가 있습니다. `idlj` 옵션의 상세한 것에 대하여는,「IDL-to-Java 컴파일러의 옵션」을 참조해 주세요.

`Service.idl` 의 `idlj` 컴파일러로, 커멘드행의 `-fall` 옵션을 사용해 생성되는 파일은 다음과 같습니다.

- `ServicePOA.java` - 서버 스켈리턴

- `_ServiceStub.java` - 클라이언트 Stub

- `Service.java` - IDL 인터페이스의 Java 판

- `ServiceHelper.java` - 보조적인 기능, 특히 `narrow()` 메소드

- `ServiceHolder.java` - `INS` 형의 퍼블릭 인스턴스 멤버를 포함한다

- `ServiceOperations.java` - `ping()` 메소드를 포함한다

### Java 파일의 컴파일

다음과 같이 해, Stub와 스켈리턴도 포함해`. java` 파일을 컴파일 합니다.

       javac *. java

### INS 서버의 기동

INS 서버를 기동합니다.

      java -classpath .  INSServer

INS 서버가 올바르게 실행되면(자), 다음의 메세지가 표시됩니다.

    INS Server is Ready...

### 클라이언트 어플리케이션의 기동

별의 단말 윈도우 또는 DOS 쉘을 열어, 클라이언트 어플리케이션을 실행합니다.

      java -classpath .  INSClient -ORBInitRef
        PingService=corbaloc:iiop:1. 2@localhost:1060/PingService

`-ORBInitRef` 옵션을 사용해 클라이언트를 실행하면(자),`PingService` 를 찾아낼 수가 있습니다. 클라이언트 윈도우에 다음의 메세지가 표시됩니다.

    The server has been pinged

서버 윈도우에 다음의 메세지가 표시됩니다.

    PingService.ping called...

이 튜토리얼을 종료하면(자), INS 서버지 하든가 종료해 주세요. DOS prompt에서는, 서버를 실행하고 있는 윈도우를 선택해 `Ctrl+C` 라고 입력하면(자) 정지합니다. Unix 쉘에서는, 클라이언트를 실행하고 있던 쉘을 열어,`pkill INSServer` 라고 입력합니다.

홈

Copyright © 1995-2004 Sun Microsystems, Inc. All Rights Reserved.