It's the first time I use java Rmi*. I have a custom class which extends UnicastRemoteObject
and implements an interface which extends remote. I think that I have implemented the methods of the interface correctly in the class but still I get an IllegalArgumentException
when I try to run my code (and it's about a method which has no arguments).
The jvm claims to have encountered an illegal remote method but the method and its implementation seem fine to me.
Is there any other reason as a result of which this exception might occur except for implementing or calling the method wrongly?
Here's the stack trace:
SEVERE: null java.rmi.server.ExportException: remote object implements illegal remote interface; nested exception is: java.lang.IllegalArgumentException: illegal remote method encountered: public abstract java.lang.String Node.getId() at sun.rmi.server.UnicastServerRef.exportObject(Unknown Source) at java.rmi.server.UnicastRemoteObject.exportObject(Unknown Source) at java.rmi.server.UnicastRemoteObject.exportObject(Unknown Source) at java.rmi.server.UnicastRemoteObject.<init>(Unknown Source) at java.rmi.server.UnicastRemoteObject.<init>(Unknown Source) at NodeImpl.<init>(NodeImpl.java:30) at NodeLauncher.main(NodeLauncher.java:11) Caused by: java.lang.IllegalArgumentException: illegal remote method encountered: public abstract java.lang.String Node.getId() at sun.rmi.server.Util.checkMethod(Unknown Source) at sun.rmi.server.Util.getRemoteInterfaces(Unknown Source) at sun.rmi.server.Util.getRemoteInterfaces(Unknown Source) at sun.rmi.server.Util.createProxy(Unknown Source) ... 7 more
Here's the interface:
import java.rmi.*; import java.util.LinkedList; interface Node extends Remote { public boolean isAlive(); public LinkedList<NodeImpl> getLeafNodes(); public LinkedList<NodeImpl> getNeighborhoodList(); public String [] getRoutingTable(); public NodeImpl initiation(String credentials,Object application); public String route(String message,String key); public void inform(byte [] id); public String getId(); public boolean isConnected(); public void applicationClose(); public boolean distanceMeasure(); }
and here's the constructor of the class:
public NodeImpl() throws RemoteException { super(); l=4; M=1; nodeId=new byte [16]; Random r=new Random(); r.nextBytes(nodeId); leafNodes=new LinkedList<NodeImpl>(); connected=false; ng=new NodeGUI(this); for(int i=0;i<l;i++) { leafNodes.add(null); } neighborhoodList=new LinkedList<NodeImpl>(); anyNodeWhoAnswered=new LinkedList<byte []>(); it=new InformingTimer(this); Thread informingTimerThread=new Thread(it); informingTimerThread.start(); try { Naming.rebind("rmi://" + "localhost" + ":1099/"+nodeId, this); } catch (Exception ex) { Logger.getLogger(NodeImpl.class.getName()).log(Level.SEVERE, null, ex); } bootstrap(); }
ServerException. This exception is thrown as a result of a remote method invocation when a RemoteException is thrown while processing the invocation on the server, either while unmarshalling the arguments or executing the remote method itself.
The RMI (Java Remote Method Invocation) system is a mechanism that enables an object on one Java virtual machine to invoke methods on an object in another Java virtual machine. Any object whose methods can be invoked in this way must implement the java. rmi.
It is a mechanism that allows an object residing in one system (JVM) to access/invoke an object running on another JVM. RMI is used to build distributed applications; it provides remote communication between Java programs. It is provided in the package java. rmi.
All of the methods on a RMI Remote
interface must declare RemoteException
in their throws
clause, e.g.:
public String getId() throws RemoteException;
It's not clear why the exception names getId()
specifically, it's probably just the first method it checked.
Also, the getLeafNodes()
and getNeighborhoodList()
methods should have return types that specify Node
, not NodeImpl
, otherwise they will likely fail also.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With