2016-07-24 4 views
0

이 스레드는 데몬이 아니므로 모든 프로그램을 종료 할 수없는 RMI Reaper 스레드에 문제가 있습니다. 이 스레드는 모든 개체가 안배되지 않은 경우에만 중지된다는 정보를 발견했습니다. 그래서 rmi serer를 만들려면 다음과 같은 코드가 있습니다.RMI : RMI 리퍼 스레드, UnicastRemoteObject 및 레지스트리

registry = LocateRegistry.createRegistry(2525); 
Server stub = (Server) UnicastRemoteObject.exportObject(defaultServer, 2525); 
registry.rebind("//localhost/server", stub); 

그리고 "unexporting"의 두 가지 버전이 있습니다.
버전 1 :

UnicastRemoteObject.unexportObject(defaultServer, true); 

버전 2 : 나는 버전 2를 사용하는 경우

UnicastRemoteObject.unexportObject(registry, true); 

- RMI 리퍼 스레드가 종료되지 않는 모든 프로그램이 종료되지 않습니다. 버전 1을 사용하면 모두 괜찮습니다.

UnicastRemoteObject.unexportObject(rmiRegistry, true); // Stop the RMI registry 

사람이 왜 레지스트리가 UnicastRemoteObject의와 연결하는 방법을 설명 할 수 그러나, 많은 곳에서 나는 다음과 같은 코드를 발견했다.

답변

2
registry = LocateRegistry.createRegistry(2525); 

레지스트리를 내 보냅니다.

Server stub = (Server) UnicastRemoteObject.exportObject(defaultServer, 2525); 

원격 객체를 내 보냅니다. defaultServer. 안 export 할 때

인체 공학적는, 당신은 당신이 언급 한 두 라인을 사용해야합니다 :

UnicastRemoteObject.unexportObject(defaultServer, true); 

자신의 원격 객체를 export 해, 그리고

UnicastRemoteObject.unexportObject(registry, true); 

는 시작 레지스트리를 export 해.

어떻게 레지스트리가 UnicastRemoteObject와 연결되어 있습니까?

원격 개체를 레지스트리에 바인딩했습니다. 레지스트리를 원격 객체의 클라이언트로 만드는 DGC 목적의 경우,이를 유지합니다.

+0

UnicastRemoteObject.exportObject를 통해 레지스트리를 내보낼 수 있습니까? –

+0

아니요, 필수 클래스의 객체를 생성하고 필요한 RMI 객체 ID를 제공 할 수 없기 때문입니다. – EJP

+0

하지만 왜 내가 레지스트리를 unexport하지 않으면 RMI 사신 스레드에 문제가 없는지? 해당 레지스트리가 자동으로 내 보낸 후 내 보낸 것을 의미합니까? –