Pregunta

Es la primera vez que el uso RMI de Java *. Tengo una clase personalizada que se extiende UnicastRemoteObject e implementa una interfaz que se extiende a distancia. Creo que he aplicado los métodos de la interfaz correctamente en la clase, pero todavía me aparece un IllegalArgumentException cuando trato de ejecutar el código (y se trata de un método que no tiene argumentos).

Las reclamaciones de JVM a haber encontrado un método remoto ilegal, pero el método y su aplicación parece bien a mí.

¿Hay alguna otra razón, como resultado de la cual podría producirse esta excepción a excepción de la aplicación o llamando al método erróneamente?


Aquí está el seguimiento 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

Esta es la unión:

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();
    }
¿Fue útil?

Solución

Todos los métodos en una interfaz Remote RMI debe declarar RemoteException en su cláusula throws, por ejemplo:.

public String getId() throws RemoteException;

No está claro por qué los nombres de excepción getId() específicamente, es probable que sólo el primer método que lo revisen.

Además, los métodos y getLeafNodes() getNeighborhoodList() debe tener tipos de retorno que especifican Node, no NodeImpl, de lo contrario, es probable que falle también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top