1

我有一个名为的接口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 个实例 MessageReceiverMessageProvider所以我试图耦合这两个接口。因此,我创建了

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)

问题很简单:为什么?我该如何解决它,保持合理的层次结构但没有例外?

4

1 回答 1

2

方法 take() 未声明为能够抛出RemoteException。这个声明是强制性的,所以没有它的方法接口是非法的。RemoteException 在执行远程方法调用期间可能发生的许多通信问题期间引发

于 2013-01-14T07:48:17.550 回答