2009-07-06 3 views
2

RMI를 사용하여 WebAppA에서 WebAppB.WebAppB로 String 객체를 전달하는 것은 RMIServer입니다. 반면 WebAppA는 RMIClient입니다. ContextListener를 WebAppB에 추가 했으므로 tomcat.And에서 컨텍스트가 초기화 될 때 rmi 서비스가 바로 시작됩니다.닫기 rmi 레지스트리

unexportObject(remoteObj,true); 
LocateRegistry.getRegistry(3232).unbind("MessagePath"); //MessagePath - name of the remote reference 

그러나 심지어 aforeseen 문 실행 후, RMI 포트에서 들어오는 요청을 수신하는 3232.I는 것을 보았다 : 나는/종료하려고 바람둥이의 contextDestroyed 방법에 다음 문을 사용하여 RMI를 종료 명령 프롬프트에서 "netsat -ano"를 사용하십시오. RMI 서비스를 닫는 데 도움을주십시오.

답변

1

getRegistry는 스텁 만 반환하므로 unexportObject에서 createRegistry가 반환 한 인스턴스를 사용하십시오. 레지스트리 더 이상 활성이 아니라, 소켓은 아직 열려하고 종료하기 위해 레지스트리를 시도 할 때

0

createRegistry 작동하지 않습니다 :-(듣고 있습니다

- 그러나 내 경우에는이 도움이되지 않습니다. 레지스트리가 이미 실행 중일 때
Registry registry = LocateRegistry.createRegistry(3232); 

이것은 당신이 사용하는 경우에도, 그래서 당신은 그러나

UnicastRemoteObject.unexportObject(registry, true); 

에서 사용하는 개체를 만들 수 없습니다. BindException 발생합니다

Registry registry = LocateRegistry.getRegistry(3232); 

스텁은 개체를 추출하기위한 매개 변수로 사용할 수 없습니다.

레지스트리가 아직 시작되지 않았 음을 확인하면 레지스트리를 시작하기 만하면되므로 걱정할 필요가있는 이유입니다. 그리고 나는 그것을 할 수있는 방법을 찾지 못했습니다!

+1

* previous *'createRegistry()'의 * 결과 *는 언 포트 될 수 있습니다.실행 중인지 확인하려면'createRegistry()'를 시도하십시오 :'BindException'을 얻으면'getRegistry()'를 호출하십시오. 물론 앞의 경우에는 unexport 만 할 수 있지만, 후자의 경우에는 다른 사람의 레지스트리이므로 unexviewing에 책임이 있습니다. – EJP

-1

나는 모든 프로세스에서 레지스트리를 종료 (그리고 그 문제에 대한 모든 바운드 레지스트리에 바인딩 된 프로세스 종료)

원격 확장하고 결국 원하는 인터페이스 중 하나를하는 방법을 발견했다 또한 다음과 같은 인터페이스를 확장해야 죽일 : 그 인터페이스의 일부로서이 함께 만드는

public interface PIDSupplierInterface extends Remote { 
    String getPID() throws RemoteException; 
} 

모든 서버 클래스는() GETPID를 구현해야합니다. 그런 다음 프로세스 ID를 리턴해야합니다. Windows 용 Google 'getpids'또는 여기로 이동 : www.jroller.com/santhosh/entry/get_current_java_process_id 리눅스에서는 PID를 이해하는 것이 더 쉽다는 것을 이해합니다. 그런 다음 (Windows에서) 레지스트리를 (프로그래밍 방식) 시작할 때 PIDSupplierServer 클래스이고, 첫째, 단순히

PIDSupplierInterface stub = PIDSupplierInterface)UnicastRemoteObject.exportObject( 
new PIDSupplierServer(), 0); 
reg.bind("regKiller", stub); 

갈 레지스트리 자체의 PID를 죽일

String PID = myServer.getPID(); 
String[] a_command = { "taskkill", "/pid", PID }; 
Runtime.getRuntime().exec(a_command, envp, dir); 

을 가고 싶어 PIDSupplierInterface 만 구현합니다. 당신이 어떤 프로세스에서 RMI 레지스트리를 죽이고 싶어 할 때

그리고, 단지

PIDSupplierInterface regProcess = (PIDSupplierInterface)reg.lookup("regKiller"); 
String regPID = regProcess.getPID(); 
String[] a_command = { "taskkill", "/pid", regPID }; 
Runtime.getRuntime().exec(a_command, envp, dir); 

등록 번호가 시스템에서 사라졌다 이동합니다. 아니면 어떤 이유로 더 복잡한 질문입니까? 모든 의견 환영.

+0

'PIDSupplierInterface'를 구현하기 위해 RMI 레지스트리를 어떻게 설득하겠습니까? 'PIDSupplierServer'를 구현합니까? – EJP