2011-01-10 8 views
37

Es ist das erste Mal, dass ich Java Rmi *. Ich habe eine benutzerdefinierte Klasse, die UnicastRemoteObject erweitert und implementiert eine Schnittstelle, die remote erweitert. Ich denke, dass ich die Methoden der Schnittstelle korrekt in der Klasse implementiert habe, aber immer noch bekomme ich eine IllegalArgumentException, wenn ich versuche, meinen Code auszuführen (und es geht um eine Methode, die keine Argumente hat).Illegale Remote-Methode in Java

Die Jvm behauptet, eine illegale Remote-Methode gestoßen, aber das Verfahren und deren Umsetzung scheinen mir in Ordnung.

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


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

Ich nehme an, Sie haben es geschafft, Ihre RMI-Registrierung zu verbinden und Ihr Remote-Objekt nachzuschlagen, nicht wahr? Können Sie Stacktrace (auf Client/Server) bereitstellen? – padis

+0

Stacktrace und etwas Code könnte helfen, dies zu beantworten. – Joel

+0

Die Ausnahme geschieht, bevor ich auch versuchen, die Fern object.It an der Linie geschieht des entfernten Objekts Konstruktor zu binden, wo ich UnicastRemoteObject Konstruktor mit Super() aufrufen. Ich habe gerade überprüft die api und sah, dass UnicastRemoteObject einen Konstruktor ohne Argumente hat so Ich verstehe nicht, was da nicht stimmt. – Range

Antwort

74

auf der Methoden Alle ein RMI Remote Schnittstelle muss RemoteException in ihrer throws Klausel erklären, z.B .:

public String getId() throws RemoteException; 

Es ist nicht klar, warum die Ausnahme Name getId() gesagt, 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.

+1

Danke !!!!! Es funktioniert !!! Du hast Recht! – Range

+0

warum muss es enthalten sein ... was ist der Mechanismus dahinter ..? –

Verwandte Themen