我有一个名为MessageReceiver
的界面,该界面正在java.rmi.Remote
扩展,以便UnicastRemoteObject.exportObject(obj)
导出。
只定义了一种方法:public boolean receive(Message msg) throws RemoteException;
接下来,我有一个名为MessageProvider
的接口,它有一个名为take()
的公共方法。此方法抛出InterruptedException
(因为它意图阻止)。
为了实现我需要的功能(缓冲区),我有一个类QueueMessageBuffer
,它有一些队列来排队消息。显然,此缓冲区“IS A” MessageReceiver
和 “IS A” MessageProvider
。
所以这是我的第一步:
public class QueueMessageBuffer implements MessageReceiver, MessageProvider
{
// ...
public boolean receive(Message m) throws RemoteException
{
// ...
}
public Message take() throws InterruptedException
{
// ...
}
}
使用此类定义,以下工作正常:
UnicastRemoteObject.exportObject(new QueueMessageBuffer(), 0);
但是因为我有另一个类,它使用1个实例作为 MessageReceiver
和MessageProvider
,我试图将这两个接口耦合在一起。因此,我创建了
public interface MessageBuffer extends MessageReceiver, MessageProvider {}
QueueMessageBuffer
,仅实施MessageBuffer
。
这似乎对我来说是正确的,但现在exportObject
给了我一个例外:
java.rmi.server.ExportException:远程对象实现非法远程接口; 嵌套异常是: java.lang.IllegalArgumentException:遇到非法远程方法:public abstract oertwig.rmichat.net.NetworkMessage oertwig.rmichat.net.MessageProvider.take()抛出java.lang.InterruptedException at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:198) at java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:310) 在java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:252)
问题很简单:为什么?我如何解决它维持一个合理的层次结构,但没有例外?
答案 0 :(得分:2)
方法take()未声明为能够抛出RemoteException。此声明是强制性的,因此没有它的方法的接口是非法的。在执行远程方法调用期间可能发生的许多通信问题期间抛出RemoteException