2011-01-10 12 views
37

È la prima volta che utilizzo java Rmi *. Ho una classe personalizzata che estende UnicastRemoteObject e implementa un'interfaccia che si estende a distanza. Penso di aver implementato correttamente i metodi dell'interfaccia nella classe, ma ottengo ancora un IllegalArgumentException quando provo a eseguire il mio codice (e si tratta di un metodo che non ha argomenti).Metodo remoto non valido in java

jvm afferma di aver riscontrato un metodo remoto non valido ma il metodo e la sua implementazione mi sembrano soddisfacenti.

Esiste qualche altra ragione per cui si possa verificare questa eccezione ad eccezione dell'implementazione o della chiamata errata del metodo?


Ecco la traccia dello stack:

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 

Ecco l'interfaccia:

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

ed ecco il costruttore della classe:

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

Suppongo che tu sia riuscito a connettere il tuo registro RMI e cercare il tuo oggetto remoto, giusto? Potete fornire stacktrace (su client/server)? – padis

+0

Stacktrace e alcuni codici potrebbero aiutare a rispondere a questo. – Joel

+0

L'eccezione si verifica prima ancora che io provi a associare l'oggetto remoto. Accade alla linea del costruttore dell'oggetto remoto dove chiamo il costruttore di UnicastRemoteObject con super(). Ho appena controllato l'api e ho visto che UnicastRemoteObject ha un costruttore senza argomenti Non capisco cosa c'è che non va. – Range

risposta

74

Tutti i metodi su a RMI Remote interfaccia deve dichiarare RemoteException nella loro throws clausola, per es .:

public String getId() throws RemoteException; 

Non è chiaro il motivo per cui i nomi delle eccezioni getId() specificamente, è probabilmente solo il primo metodo di farlo controllare.

Inoltre, i getLeafNodes() e getNeighborhoodList() metodi dovrebbero avere tipi di ritorno che specificano Node, non NodeImpl, altrimenti saranno probabilmente fallirà anche.

+1

Grazie !!!!! Funziona !!! Hai ragione! – Range

+0

perché deve essere incluso ... qual è il meccanismo alla base di questo ..? –

Problemi correlati