•분산
객체를 사용하는 것은 이 분산객체(원격으로
서비스를 제공하는 객체)를
통해 원격의 클라이언트에 제공 하고자 하는 서비스(메소드)가
있을 것이다.
•원격
인터페이스는 클라이언트가
원격으로 호출 할 메소드
즉 원격 메소드를
정의하는
것이다.
•원격
객체가 구현 할 인터페이스 이다.
•java.rmi.Remote
인터페이스를
직/간접적으로
상속해야 한다.(보통
직접 상속 한다.)
•원격
인터페이스에서 정의한 모든
메소드는
java.rmi.RemoteException이나
부모클래스(java.io.IOException,
java.lang.Exception)을
throws
해야
한다.(RMI
스펙에는
RemoteException을
throws
하도록
권고 한고 있다.)
public
interface Hello extends java.rmi.Remote
{
public String sayHello(String
name) throws java.rmi.RemoteException;
}
•RMI
서버
Application은
원격 인터페이스 구현 클래스의 인스턴스를
생성하여 이를 rmiregistry에
이름으로 등록
한다.
•원격
객체는 자신을 원격의 클라이언트가 접근 할 수 있도록 등록 할 수 있어야 하며 클라이언트에서 원격 메소드
요청이 발생 했는지 지속적으로 모니터링 할 수 있어야 한다.
아쉽게도
원격 인터페이스에는 이러한 기능은 정의되지 않았다.
•HelloImpl
객체가
원격 객체로
작동 할 수 있는것은
원격메소드를
구현해서가 아니라 java.rmi.server.UnicastRemoteObject를
상속했기 때문이다.
•java.rmi.server.Remote,
java.rmi.server.RemoteServer
클래스에서
정의하는 기능을 가져야 한다.
- java.rmi.server.Remote,
java.rmi.server.RemoteServer
클래스에서
정의하는 기능을 가져야 한다.
- 원격객체는
RMI
스펙에서
제안하는 규격에 맞게 java.lang.Object에서
상속한 hashCode,
equals, toString
메소드를
재정의 할 필요가 있으며 원격객체임을 RMI
시스템에
알리고 자신을 원격 객체로 rmiregistry에
등록 할 수 있어야 한다.
-
- RemoteObject
클래스는
hashCode,
equals, toString을
RMI에
맞게 재정의 하고 있으며 RemoteServer
클래스는
원격 클라이언트에서 오는 원격 메소드
호출을 처리하는 기능을 정의 하고 있다.
- 이
두개의 클래스 RemoteObject와
RemoteServer의
기능을 동시에 가지고 있는 클래스가 UnicastRemoteObject 클래스이며
일반적으로 원격 인터페이스를 구현한 클래스(RMI
원격
객체 클래스)는
UnicastRemoteObject를
상속한다.
그러나
반드시 상속해야 하는 것은 아니며 기능을 구현한 다른 클래스를 상속해도 무방하다.
•원격
객체 기능 구현을 위해 java.rmi.server.RemoteObject
클래스를
상속한 경우에는 default
생성자를
반드시 정의 해야 한다.
- UnicastRemoteObject
클래스는
자신의 생성자에서
원격 객체를 등록하는 기능을 정의하고 있다.
- 왜
반드시 해야할까?
안하면
컴파일시
에러가 발생한다.
물론
이것은 이유가 아니며 궁극적인 이유는 상속받는 RemoteObject의
생성자가 RemoteException을
throws
하고
있으므로 하위 클래스인 “원격 인터페이스 구현 클래스”의 생성자에서도 RemoteException
댓글 없음:
댓글 쓰기