Java Rmi *を使用するのは初めてです。UnicastRemoteObject
を拡張し、リモートを拡張するインターフェースを実装するカスタムクラスがあります。メソッドを実装したと思いますクラスで正しくインターフェイスしますが、コードを実行しようとするとIllegalArgumentException
が返されます(引数のないメソッドに関するものです)。
Jvmは不正なリモートメソッドに遭遇したと主張していますが、メソッドとその実装は私には問題ないようです。
メソッドを誤って実装または呼び出す以外に、この例外が発生する可能性がある他の理由はありますか?
スタックトレースは次のとおりです。
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();
}
RMI Remote
インターフェースのすべてのメソッドは、RemoteException
節でthrows
を宣言する必要があります。例:
_public String getId() throws RemoteException;
_
例外の名前がgetId()
である理由が明確ではありません。おそらく、これはおそらく最初にチェックしたメソッドにすぎません。
また、getLeafNodes()
メソッドとgetNeighborhoodList()
メソッドには、Node
ではなくNodeImpl
を指定する戻り値の型が必要です。そうしないと、失敗する可能性があります。