有没有办法通过RMI对象发送事件?

问题描述:

我有几个客户端都通过RMI引用相同的远程对象,我想知道是否有可能发送事件到所有客户端中的存根对象,当他们中的一个运行远程方法。例如,如果远程对象“obj”具有“updateValue()”方法,并且客户端A通过存根对象运行它,具有真实“obj”的服务器是否可以发送一个事件来通知客户端A,B ,C等...该对象已更新?有没有办法通过RMI对象发送事件?

RMI是一种客户端 - 服务器技术,可以使用RMI通道与服务器上的远程对象进行通信,但服务器无法调回客户端。

但是,没有任何东西可以阻止你拥有两个RMI通道,因此如果你明白我的意思,那么双方都可以作为客户端服务器。

我们这样做是为了将通知发送到连接到*服务器的桌面应用程序,并且它工作正常。桌面应用程序导出(以RMI说法)一个回调存根,连接到*服务器,并在服务器上注册回调存根。然后服务器可以向所有连接的桌面应用程序发送通知。当然,您需要设置网络基础设施(防火墙等),以便可以进行双向连接。所以是的,我会说这是可能的,但需要比单一的单向通道更多的努力。

我只是很快看了一下this article,但它似乎说明了这个想法(如果情况并非如此,请告诉我,我确定我可以在此用例中找到代码段)。

其他选择包括轮询或JMS,如在其他答案中提到的。

您所描述的是“push”机制,它不是RMI的一部分。你可以轻松做什么是某种“pull”机制,其中对象A,B,C等轮询服务器以查找任何新事件。但这也不是RMI的事实部分。您必须实现一个名为getNewEvent()的附加方法,该方法每X秒调用一次服务器,以了解是否发生了新事件。

你可能想看看一个事件通道/ Java消息传递服务(JMS) - 我认为这几乎是你在说什么。这是J2EE的核心功能,但是JMS解决方案可以在您的系统中使用,而无需J2EE的其他部分。

JMX有一个远程工作的事件API--并没有直接使用它。

如果你想变得很花哨,你可以在所有客户端机器上启动RMI服务器,并让它们将存根传递给持有该对象的“主”服务器。该主服务器可以使用标准侦听器/模型模式调用存根。

如果是我,我会与动态主题的JMS。