2014-10-02 3 views
0

자바에 대한 오라클의 RMI 자습서를 이해하려고하는데 몇 가지 질문이있었습니다. 참조 용 가이드가 여기에 연결되어자바 RMI - 오라클 자습서 이해

1) 서버 예에서, 기본 함수의 마지막 행은 다음 System.out.println("ComputeEngine bound");. 정상적인 실행은이 시점에서 main 함수가 종료되고 프로그램이 종료된다고 말합니다. 그러나 뭔가가 프로그램을 차단하고 있습니다. 누구든지 왜 서버가 실행될 때 프로그램 블록 (인쇄 된 컴퓨팅 엔진 바운드 이후에 종료하지 않고)을 차단하는지 알 수 있습니까?

2) 이전 질문과 관련하여 서버가 포트에서 수신 및 수신 대기중인 것 같습니다. 어떤 항구에서 듣고 있습니까? RMIRegistry는 서버가 수신하는 포트를 어떻게 알 수 있습니까?

3) 클라이언트가 계산은 rmiregistry에, 또는 서버 코드를 실행하는 시스템을 실행하는 컴퓨터에서 발생합니까,이 스텁에 executeTask를 호출 다음() registry.lookup를 사용하여 rmiregistry의에서 스텁을 얻을 때 내 다른 질문은? 즉, 스터브는 을 레지스트리에 있거나 서버의 main 함수 내에있는 computeEngine 인스턴스에서 실행하도록 RMIRegistry에 알 립니까?

답변

2

RMI는 백그라운드 수신 스레드를 생성합니다. 스레드가 죽을 때까지 프로그램이 종료되지 않습니다.

포트를 0으로 지정합니다. 즉, OS가 범위를 정의하는 임의의 포트를 사용합니다.

스텁은 해당 메소드를 호출하도록 서버에 알리기 위해 TCP/IP 호출을 캡슐화합니다. 따라서 실제 구현은 코드를 호스팅하는 서버에서 실행됩니다. 서버 코드에 println을 추가하면 해당 함수가 호출 될 때 println이 출력됩니다.

+0

감사! 그게 도움이. – user1413793

+1

다음과 같이 추가하십시오. "RMIRegistry는 서버가 수신하는 포트를 어떻게 알 수 있습니까?" 스텁에 내장되어 있습니다. 그러나 레지스트리 JVM에서 RMI 런타임 시스템에 의해 수행되는 DGC 용도로만 알면됩니다. 레지스트리 자체는 포트를 전혀 알 필요가 없습니다. – EJP

+0

지정하는 포트를 지정합니다. 지정하지 않으면 0을 지정합니다. OS는 범위가 아닌 임의의 포트 자체를 제공합니다. – EJP

0
  1. RMI는 수신 대기중인 모든 포트에 대해 수신 스레드를 만듭니다. 이러한 스레드는 해당 포트에서 내 보낸 모든 원격 객체가 명시 적으로 또는 DGC를 통해 unexport되었을 때만 종료됩니다.
  2. 원격 객체를 생성하거나 내보낼 때 지정한 포트에서 수신 대기 중이거나 사용자가 지정하지 않았거나 0을 지정한 경우 시스템 할당 포트를 수신합니다. 레지스트리는 포트가 무엇인지 '알지 못하지만 스텁은 않습니다.
  3. 다른 호스트의 레지스트리에 원격 객체를 바인드하는 것이 어렵 기 때문에 (불가능하지는 않지만) 원격 객체가 익스포트 된 호스트에서 계산이 이루어 지지만 일반적으로 레지스트리와 동일한 호스트입니다.