2009-04-21 4 views
5

두 시스템 사이에서 RMI 통신 링크를 설정하고 나면 "원격"을 구현하는 객체를 해당 유형의 객체를 사용하는 원격 메소드 중 하나에 전달할 수 있습니다. 그냥 새 개체에 대한 원격 인터페이스를 가져옵니다. 즉, 개체를 직렬화하는 것과 반대되는 새로운 원격 연결이됩니다.RMI - 원격 메소드를 통해 원격 객체를 전달하는 방법은 무엇입니까?

이 정보가 맞습니까?

그렇다면이 방법은 서명과 관련이 있다고 가정합니다. 그러나 전체 개체를 단순히 serialize하는 대신 새로운 원격 개체를 만들어야한다고 결정하는 방법을 정확히 알고 싶습니다.

이것은 말로 표현하기가 정말 어렵습니다. 이것을 시도하겠습니다 :

제가 클라이언트와 서버 시스템을 가지고 있다고 가정 해 봅시다. 서버 시스템에서 RMI 객체를 만들고 게시하며 클라이언트 시스템에서 인터페이스를 검색하고 서버 시스템과 상호 작용할 수 있습니다.

Client       Server 
Object1 RemoteIface  ---- Object1 Implementation 

지금까지 그렇게 좋았습니다. Client에서는 Object1.remoteMethod()가 매개 변수를 통해 직렬화 된 후 서버에서 실행됩니다.

Client       Server 
Object1 RemoteIface ----- Object1 Implementation 
Object2 Implementation ----- Object2 RemoteIface  
:

Object2 object2=new object2(); // Also a remote object 
object1.send(object2); 

내가 알고있는 것처럼, 그 시점에서, 내 시스템은 새로운 통신 메커니즘을해야합니다 :

이제

, 여기에 문제는 클라이언트에서 나는 다음과 같은 코드를 실행입니다

이 시점에서 서버가 Object2의 메서드를 호출하면 해당 메서드가 실제로 클라이언트에서 실행됩니다.

필자는 시스템이 어떤 원격 객체가 아닌 것처럼 그것을 직렬화하는 대신 어떤 일을하기로 결정했는지 궁금합니다.

아니면 내가 완전히 잘못이고 그냥 그것을 직렬화하고 실제로 "원격 호출을 만들려면 getRemoteInterface()"메서드 호출이 필요합니까?

답변

6

이게 바로 Proxy Pattern입니다. 원격 끝에 인스턴스화 된 것은 값을 전송하고 메소드를 활성화하는 코드를 생성했습니다.

java.rmi.Remote 자체는 단지 "태깅 인터페이스"입니다. 실제 작업을 수행하려면 구현이 필요합니다. 더 많은 것을 위해 this JavaCamp tutorial를보십시오.

업데이트 : 좋아, 다른 방향으로 이동합니다. 예, 개체를 직렬화하고 전선을 통과해야합니다. 아마도 가장 좋은 방법은 Java Tutorial on RMI을 먼저 처리하는 것입니다. 그러나 기본적으로 Serializable은 Java에 객체가 XML 또는 YAML과 같은 내부 문자열 형식으로 변환 될 준비가되었음을 알리는 또 다른 태그 지정 인터페이스입니다. 해당 형식의 클래스 파일을 사용할 수있는 한 해당 형식을 수신 측에서 일치하는 개체로 "다시 수"할 수 있습니다.

+0

나는 당신이 이해하고 있는지 확신하지 못합니다. 나는 그것을 다시 말하려고 노력할 것이다 ... –

+1

찰리가 내가했던 것처럼 당신의 질문을 해석하고있는 것처럼 들리며, 그의 대답으로 목표물에 바로있다. Remote를 구현하는 매개 변수를 전달하거나 객체를 반환하면 동적 프록시 스켈레톤이 만들어지고 해당 스켈레톤을 처리하는 끝점 정보가 전송됩니다 ("값"대신 "참조"와 유사). 리시버에서는 원격 객체와 통신하기 위해 동적 프록시 스텁이 작성됩니다. 직렬화가 아닌 원격에 대한 결정은 원격 인터페이스를 기반으로합니다. – erickson

+0

좋아, 네가 맞았는지 알 겠어. 내 질문을 다시 써서 시간 낭비 했어. 하지만 "RemoteInterface"부분에 대해 더 명확하게 표현할 수 있습니까? 원격 인터페이스로 간단하게 캐스트하면 인터페이스가 구현과 분리되거나 메소드 호출을 통과해야합니까? –