Método remoto ilegal en java
rmi runtime-error (1)
Es la primera vez que uso java Rmi *. Tengo una clase personalizada que extiende UnicastRemoteObject
e implementa una interfaz que se extiende a distancia. Creo que he implementado los métodos de la interfaz correctamente en la clase pero aún así obtengo una IllegalArgumentException
cuando intento ejecutar mi código (y se trata de un método que no tiene argumentos).
El jvm afirma haber encontrado un método remoto ilegal, pero el método y su implementación me parecen bien.
¿Hay alguna otra razón como resultado de la cual podría ocurrir esta excepción, excepto para implementar o llamar al método incorrectamente?
Aquí está la traza de la pila:
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
Aquí está la interfaz:
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();
}
Y aquí está el constructor de la clase:
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();
}
Todos los métodos en una interfaz Remote
RMI deben declarar RemoteException
en su cláusula de throws
, por ejemplo:
public String getId() throws RemoteException;
No está claro por qué los nombres de excepción getId()
específicamente, probablemente sea solo el primer método que verificó.
Además, los getLeafNodes()
y getNeighborhoodList()
deben tener tipos de retorno que especifiquen Node
, no NodeImpl
, de lo contrario, también es probable que también fallen.