我有一个名为的接口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() 在 sun.rmi.server.UnicastServerRef 处抛出 java.lang.InterruptedException。在 java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:252) 的 java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:310) 的 exportObject(UnicastServerRef.java:198)
问题很简单:为什么?我该如何解决它,保持合理的层次结构但没有例外?