2013-07-08 3 views
1

RMI 이론에 대해 확인하고 싶습니다. 무효 foo는 (INTERF의 OBJ) :RMI에서 원격 매개 변수 전달

우리가 클라이언트 A는 서버 B

음에 객체 O의 원격 참조를 요청한다고 가정하자 O 인터페이스 (INTERF)에서하는 방법 등이 지금 경우 ;

클라이언트 A가 O.foo (O)를 호출하면 스텁 레퍼런스 (수신 전)를 전달한 다음 서버가 로컬 참조를 사용하지 않고 클라이언트가 수신 한 스텁 객체를 사용하므로 서버별로 O 메소드를 호출합니다 TCP/IP 서비스를 사용할 것입니다.

괜찮습니까?

RMI 이해를 향상시킬 수 있다고 생각되면 자유롭게 세부 정보를 추가해야합니다.

감사

+0

세부 사항을 추가해야합니까? (1) '원격 참조 요청'이란 무엇입니까? (2) '로컬 참조가 아니라 스텁 객체'를 사용한다는 것은 무엇을 의미합니까? (3) 'TCP/IP 서비스 사용'이란 무엇을 의미합니까? (4) 'TCP/IP 서비스'는 누구입니까? 다시 말해서이 질문은 실제로 무엇에 관한 것입니까? – EJP

+0

원격 참조 요청 의미 : Interf O = (Interf) 조회 (...); 내 질문은 서버가 원격 메서드의 매개 변수로 자체적으로 만든 원격 참조를받는 상황과이 원격 참조를 사용하는 서버가 로컬 참조를 사용하지 않지만 방금받은 스텁에 대한 것입니다. 확인을하고 싶습니다 – Edge7

+0

내 보낸 원격 개체가 원격 스텁으로 보내지지만 그 반대는 발생하지 않습니다. 왜 클라이언트가 이미 가지고있는 서버를 보냅니 까? – EJP

답변

2

CORBA 서버 (RMI/IIOP하지 RMI/JRMP을 구현하는 데 사용) 일반적으로 "함께 위치한 스텁"최적화를 구현한다. 즉, 서버가 동일한 프로세스에있는 객체에 대해 스텁의 메소드를 호출하면 CORBA 서버는 일반적으로 TCP/IP 및 스레드 풀 디스패치 오버 헤드를 피합니다. 대신 매개 변수가 복사되고 메서드가 대상 객체에서 호출되며 결과 객체가 복사되어 반환됩니다.

Java 서버는 일반적으로이 최적화를 구현합니다. 생성 된 스텁 클래스는 Util.isLocal 메서드를 사용하여 스텁 대상이 로컬인지 여부를 확인합니다. 다음, 스텁. 로컬 서번트에 대한 참조/프록시를 얻기 위해 _servant_preinvoke이 호출되고, 매개 변수를 복사하고 객체를 반환하는 데 Util.copyObjects (또는 Util.copyObject)이 사용됩니다. (예외 처리, RemarshalException 등과 같은 추가 복잡성이 있지만 기본 흐름을 간략하게 설명했습니다.)

+1

이것은 RMI/IIOP에 해당합니다. RMI/JRMP는 분명히 * 사실이 아닙니다. 최적화를 실시하기 위해서 (때문에), RMI/JRMP의 지정된 시멘틱스를 위반합니다. – EJP

+0

죄송합니다. 제 답변이 RMI/IIOP 인 경우가 더 분명해야했습니다. 나는 RMI/JRMP에 대한 많은 경험이 없다. 내 지식으로는, 의미를 위반 한 포인터 (또는 더 긴 설명)를 줄 수 있습니까? 감사! –

+0

[원격 메소드 호출 사양 # 2.6] (http://docs.oracle.com/javase/7/docs/platform/rmi/spec/rmi-objmodel7.html)은 모든 인수와 반환 값이 직렬화에 의해 전달된다는 것을 제공합니다 즉, 원격 객체를 내 보낸 경우가 아니면 값 복사본을 사용하여 스텁을 전달합니다. RMI를 로컬 메소드 호출로 변환하면 로컬 메소드 인수 및 결과가 참조로 전달되기 때문에 RMI를 위반하게됩니다. – EJP