Frage

Es ist das erste Mal, dass ich verwenden Java Rmi *. Ich habe eine benutzerdefinierte Klasse, die UnicastRemoteObject und implementiert eine Schnittstelle, die entfernt erstreckt erstreckt. Ich denke, dass ich die Methoden der Schnittstelle richtig in der Klasse implementiert haben, aber ich bekomme immer noch eine IllegalArgumentException wenn ich versuche, meinen Code zu laufen (und es geht um ein Verfahren, das keine Argumente hat).

Die Jvm Ansprüche auf eine rechtswidrige Fern Methode gestoßen, aber das Verfahren und deren Umsetzung scheinen gut zu mir.

Gibt es einen anderen Grund als Folge davon diese Ausnahme mit Ausnahme für die Durchführung oder den Aufruf der Methode auftreten könnte falsch?


Hier ist der 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

Hier ist die Schnittstelle:

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();
}

und hier ist der Konstruktor der Klasse:

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();
    }
War es hilfreich?

Lösung

Alle Methoden auf einer RMI Remote Schnittstelle RemoteException in ihrer throws Klausel erklären müssen, z.

public String getId() throws RemoteException;

Es ist nicht klar, warum die Ausnahme Namen speziell getId(), es ist wahrscheinlich nur die erste Methode geprüft.

Auch die getLeafNodes() und getNeighborhoodList() Methoden sollten Rückgabetypen haben, die Node angeben, nicht NodeImpl, sonst werden sie wahrscheinlich auch nicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top