Насколько я понимаю, реестр 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
- Почему rmiregistry нужен стаб-файл класса?
- Что это за ошибка, которую я вижу? Даже если rmiregistry не может отменить маркер, который экспортируется UnicastRemoteObject, ему не следует регистрировать эту ошибку в rmiregistry?
Итак, реестр RMI перебрасывает это исключение обратно на удаленную службу, которая пытается связать? –
Ну, время выполнения RMI в реестре JVM делает это. – EJP
То же самое происходит с 'JNDI'? Если я попытаюсь создать источник данных oracle JDBC и зарегистрировать его в rmiregistry, привязка завершится неудачно, если в реестре rmi нет доступных файлов jar-файлов драйверов? –