Aniket Thakur
Aniket Thakur

Reputation: 68905

Why does RMI registry need access to stub class file?

As far as my understanding goes RMI registry maintains a HashMap sort of data structure that stores name and stub mapping where stub is essentially an Object - Atleast that what we get when we call Naming.lookup().

When I start remiregistry from the directory that has stub class file everything works fine. Binding happens correctly. But If I don't and I startup remote service -

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

I get Exception -

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. Why does rmiregistry need stub class file?
  2. What is that unmarshalling error that I see? Even if rmiregistry is not able to unmarshall the stub exported by UnicastRemoteObject to it shouldn't rmiregistry log that error?

Upvotes: 2

Views: 721

Answers (1)

user207421
user207421

Reputation: 310850

Why does rmiregistry need stub class file?

Because it's just another RMI server and obeys the same semantics as other RMI servers and clients.

What is that unmarshalling error that I see?

It is exactly the same exception that any other RMI client would get if it passed a parameter to a server that didn't have that class available to it.

Even if rmiregistry is not able to unmarshall the stub exported by UnicastRemoteObject to it shouldn't rmiregistry log that error?

No, because the RMI Registry doesn't even get to see it. It all happens within the RMI runtime while ummarshalling the call, before the Registry code even executes. In fact the Registry code hasn't executed at all.

Upvotes: 3

Related Questions