2011-01-10 17 views
37

Bu java Rmi * kullanıyorum ilk kez. UnicastRemoteObject'u genişleten özel bir sınıfım var ve uzaktan genişleten bir arabirim uygular. Arayüzün yöntemlerini sınıfta doğru bir şekilde uygulamış olduğumu düşünüyorum ama kodumu çalıştırmaya çalıştığımda hala bir IllegalArgumentException alıyorum (ve argüman içermeyen bir yöntemle ilgili).Java'da geçersiz uzaktan yöntem

jvm, yasa dışı bir uzaktan yöntemle karşılaştığını iddia ediyor ancak yöntem ve uygulaması benim için iyi görünüyor. Bu yöntemin yanlış uygulanması veya aranması dışında bir istisna meydana gelmesinin başka bir nedeni var mı? Burada

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 

arayüz:

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

burada sınıfın yapıcı verilmiştir:

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

RMI kayıt defterinizi bağlamayı ve uzak nesneyi aramayı başardığınızı varsayalım, değil mi? Stacktrace (istemci/sunucuda) sağlayabilir misiniz? – padis

+0

Stacktrace ve bazı kodlar buna cevap vermede yardımcı olabilir. – Joel

+0

Uzak nesneyi bağlamadan bile istisna gerçekleşir. UnicastRemoteObject yapıcısını super() olarak adlandırdığım uzaktaki nesnenin yapıcısı satırında olur. Sadece api'yi kontrol ettim ve UnicastRemoteObject öğesinin hiçbir argüman içermeyen bir kurucu olduğunu gördüm. Orada neyin yanlış olduğunu anlamıyorum. – Range

cevap

74

ilgili yöntemlerin tümü, burada


yığın izleme bir RMI Remote arayüz istisna isimleri getId() açık belirtmek gerekirse, muhtemelen kontrol sadece ilk yöntem neden net değil

public String getId() throws RemoteException; 

.: onların throws fıkrada örneğin RemoteException bildirmelidir.

Ayrıca getLeafNodes() ve getNeighborhoodList() yöntemleri aksi halde olasılıkla da başarısız olacaktır, Node değil NodeImpl belirtmek dönüş türlere sahip olmalıdır.

+1

aralığınıza teşekkürler !!!!! Çalışıyor !!! Haklısınız! – Range

+0

neden dahil edilmeli ... bunun arkasındaki mekanizma nedir ..? –

İlgili konular