Java RMI - 作为远程“定义”接口扩展(遇到非法远程方法)

时间:2013-01-14 07:41:05

标签: java networking interface rmi

我有一个名为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()抛出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)

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

1 个答案:

答案 0 :(得分:2)

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