gpt4 book ai didi

Java RMI - 扩展为远程 "defined"接口(interface)(遇到非法远程方法)

转载 作者:行者123 更新时间:2023-11-30 04:32:30 25 4
gpt4 key购买 nike

我有一个名为 MessageReceiver 的接口(interface),它扩展了 java.rmi.Remote 以便能够由 UnicastRemoteObject.exportObject(obj) 导出>。仅定义了一个方法:public boolean receive(Message msg) throws RemoteException;

接下来,我有一个名为 MessageProvider 的接口(interface),它有一个名为 take() 的公共(public)方法。此方法会引发 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,所以我尝试耦合这两个接口(interface)。因此,我创建了

public interface MessageBuffer extends MessageReceiver, MessageProvider {}

使用QueueMessageBuffer此外仅实现MessageBuffer

这对我来说似乎是正确的,但现在 exportObject 给了我一个异常(exception):

java.rmi.server.ExportException: remote object implements illegal remote interface; nested exception is: java.lang.IllegalArgumentException: illegal remote method encountered: public abstract oertwig.rmichat.net.NetworkMessage oertwig.rmichat.net.MessageProvider.take() throws java.lang.InterruptedException at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:198) at java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:310) at java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:252)

问题很简单:为什么?我该如何解决这个问题,同时保持合理的层次结构,但又没有异常(exception)?

最佳答案

take() 方法未声明为能够抛出 RemoteException 。该声明是强制性的,因此没有它的带有方法的接口(interface)是非法的。在执行远程方法调用过程中可能出现的一些通信问题时抛出RemoteException

关于Java RMI - 扩展为远程 "defined"接口(interface)(遇到非法远程方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14314737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com