2014-02-07 1 views
-1

이하의 네임 .lookup()를 사용하면, 리모트 메소드의 RMI 서비스 검증이 동작하지 않습니다. 어떤 오류도주지 않지만 원격 인터페이스 값을 반환하지는 않습니다.RMI의 네이밍 검색은 ClassNotFoundException에 의한 UnmarshalException를 슬로우한다

Registry reg; 
String serverAddress = "xxxxx"; 
String serverPort = "xxxx"; 
String text = "x"; 
try { 
    reg= LocateRegistry.getRegistry(serverAddress, (new Integer(serverPort)).intValue()); 
    final String regsitryList[] = registry.list(); 
    // Remote r = registry.lookup("xservice") ; 
    if (Arrays.asList(regsitryList).contains("xservice")) { 
     Remote r = registry.lookup("xservice"); 
     if(r!=null) 
     log.debug("found the service"); 
    } 
} catch (RemoteException re) { 
    re.printStackTrace(); 
} 
+0

그래서 * 돌려 주는가? 리모트 인터페이스에 캐스트 할 수 있습니까? – EJP

+0

아니요. 서비스가 시작되어 실행 중이며 캡처 할 필요가 없는지 확인해야하기 때문에 반환하지 않습니다. – mahesh

+0

그래서 반환하는 것이 무엇인지 모르는 경우 원격 인터페이스의 인스턴스가 아닌 것을 어떻게 알 수 있습니까? 당신의 질문은 무엇입니까? 그리고 왜 list()와 lookup()을 호출할까요? – EJP

답변

0

원격 인터페이스 또는 스텁, 또는 클래스를 언급 인해 ClassNotFoundException에 거의 확실 할 것이다 일어나지 않았다 주장 예외를 제공하는에서 실행되는 모든 서비스를 검색하지만 찾을 수 있었다 그 그들은에 의존합니다. list()으로 전화하면 개체 클래스가 아닌 문자열 만 검색하므로 아무런 예외도 없습니다.

list()lookup() 모두 개체가 현재 레지스트리에 바인딩되어 있는지 여부를 알려줍니다. 그렇다고해서 그 객체가 여전히 존재한다는 것을 의미하지는 않습니다. 그것을 알기 위해서는 원격 메소드를 실행해야합니다. 그 때문에 당신은 실종 된 수업이 필요할 것입니다.

+0

귀하의 도움에 @EJP 감사합니다. – mahesh

+0

감사합니다. 문제를 제대로 설명하고 스택 트레이스를 포함 시키면 '할 수 없음'과 같은 말 대신 '오류가 발생하지 않음'을 표시하는 것이 훨씬 더 빠르다는 것을 알 수 있습니다. – EJP