2015-02-14 4 views
1

Насколько я понимаю, реестр RMI поддерживает структуру данных HashMap, которая хранит имя и заглушку, где заглушка по существу является объектом - по крайней мере, что мы получаем, когда вызываем Naming.lookup().Зачем нужен реестр RMI для доступа к файлу класса stub?

Когда я запускаю редирекцию из каталога с файлом класса заглушки, все работает нормально. Связывание происходит правильно. Но если я не я и запуска удаленной службы -

public static void main(String args[]) 
{ 
    try { 
     GreeterService greeterService = new GreeterServiceImpl(); 
     Naming.rebind("greeterServiceObj", greeterService); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

я получаю исключение -

C:\Users\athakur\newJavaWorkspace\RMIDemo\src>java GreeterServiceImpl 
java.rmi.ServerException: RemoteException occurred in server thread; nested exception 
is: 
     java.rmi.UnmarshalException: error unmarshalling arguments; nested exception i 
s: 
     java.lang.ClassNotFoundException: GreeterServiceImpl_Stub 
     at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:400) 
     at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:248) 
     at sun.rmi.transport.Transport$1.run(Transport.java:159) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at sun.rmi.transport.Transport.serviceCall(Transport.java:155) 
     at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535) 
     at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java 
:790) 
     at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java: 
649) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.j 
ava:886) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java: 
908) 
     at java.lang.Thread.run(Thread.java:662) 
     at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Sour 
ce) 
     at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source) 
     at sun.rmi.server.UnicastRef.invoke(Unknown Source) 
     at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source) 
     at java.rmi.Naming.rebind(Unknown Source) 
     at GreeterServiceImpl.main(GreeterServiceImpl.java:19) 
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exceptio 
n is: 
     java.lang.ClassNotFoundException: GreeterServiceImpl_Stub 
     at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source) 
     at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:390) 
     at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:248) 
     at sun.rmi.transport.Transport$1.run(Transport.java:159) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at sun.rmi.transport.Transport.serviceCall(Transport.java:155) 
     at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535) 
     at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java 
  1. Почему rmiregistry нужен стаб-файл класса?
  2. Что это за ошибка, которую я вижу? Даже если rmiregistry не может отменить маркер, который экспортируется UnicastRemoteObject, ему не следует регистрировать эту ошибку в rmiregistry?

ответ

3

Зачем rmiregistry нужен файл класса заглушки?

Потому что это всего лишь еще один сервер RMI и подчиняется той же семантике, что и другие серверы и клиенты RMI.

Что это за ошибка, которую я вижу?

Это то же самое исключение, что и любой другой клиент RMI, если он передал параметр серверу, который не имел этого класса, доступного для него.

Даже если rmiregistry не может отменить маркер, экспортированный UnicastRemoteObject, ему не следует регистрировать ошибку rmiregistry?

Нет, потому что реестр RMI даже не видит его. Все это происходит во время выполнения RMI при одновременном вызове вызова до того, как код Registry даже выполняется. На самом деле код реестра вообще не выполнен.

+0

Итак, реестр RMI перебрасывает это исключение обратно на удаленную службу, которая пытается связать? –

+0

Ну, время выполнения RMI в реестре JVM делает это. – EJP

+0

То же самое происходит с 'JNDI'? Если я попытаюсь создать источник данных oracle JDBC и зарегистрировать его в rmiregistry, привязка завершится неудачно, если в реестре rmi нет доступных файлов jar-файлов драйверов? –

 Смежные вопросы

  • Нет связанных вопросов^_^