2011-01-10 18 views
37

में अवैध रिमोट विधि यह पहली बार है जब मैं जावा आरएमआई * का उपयोग करता हूं। मेरे पास एक कस्टम क्लास है जो UnicastRemoteObject फैली हुई है और एक इंटरफ़ेस लागू करती है जो रिमोट को बढ़ाती है। मुझे लगता है कि मैंने कक्षा में सही तरीके से इंटरफेस के तरीकों को लागू किया है, लेकिन जब भी मैं अपना कोड चलाने की कोशिश करता हूं तो मुझे IllegalArgumentException मिलता है (और यह एक विधि है जिसके बारे में कोई तर्क नहीं है)।जावा

जेवीएम का दावा है कि एक अवैध रिमोट विधि का सामना करना पड़ा है लेकिन विधि और इसका कार्यान्वयन मेरे लिए ठीक लग रहा है।

क्या कोई अन्य कारण है जिसके परिणामस्वरूप यह अपवाद गलत तरीके से कार्यान्वित करने या कॉल करने के अलावा हो सकता है?


यहाँ स्टैक ट्रेस है:

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 

यहां इंटरफ़ेस है:

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

और यहाँ वर्ग के निर्माता है:

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

मुझे लगता है कि आप अपनी आरएमआई रजिस्ट्री को कनेक्ट करने और अपने रिमोट ऑब्जेक्ट को देखने में कामयाब रहे हैं, है ना? क्या आप स्टैकट्रैक (क्लाइंट/सर्वर पर) प्रदान कर सकते हैं? – padis

+0

स्टैकट्रैक और कुछ कोड इसका जवाब देने में मदद कर सकते हैं। – Joel

+0

रिमोट ऑब्जेक्ट को बांधने का प्रयास करने से पहले अपवाद होता है। यह रिमोट ऑब्जेक्ट के कन्स्ट्रक्टर की रेखा पर होता है जहां मैं सुपर() के साथ यूनिकास्ट रिमोट ऑब्जेक्ट के कन्स्ट्रक्टर को कॉल करता हूं। मैंने अभी एपीआई की जांच की है और देखा है कि यूनिकास्ट रिमोट ऑब्जेक्ट में कोई तर्क नहीं है मुझे समझ में नहीं आता कि क्या गलत है। – Range

उत्तर

74

पर सभी पद्धतियों का एक आरएमआई Remote इंटरफेस उनके throws खंड में RemoteException घोषित करना चाहिए, उदा .:

public String getId() throws RemoteException; 

यह स्पष्ट नहीं अपवाद नाम getId() विशेष रूप से, यह शायद सिर्फ पहली विधि यह जाँच नहीं है।

इसके अलावा, getLeafNodes() और getNeighborhoodList() तरीकों वापसी प्रकार है कि Node, नहीं NodeImpl निर्दिष्ट होनी चाहिए, अन्यथा वे संभावना भी असफल हो जायेगी।

+1

पर रेंज करें !!!!! यह काम करता है !!! तुम सही हो! – Range

+0

इसे शामिल करने की आवश्यकता क्यों है ... इसके पीछे तंत्र क्या है ..? –