我有几个客户端都通过RMI引用同一个远程对象,我想知道当其中一个客户端运行远程方法时,是否可以向所有客户端的存根对象发送事件。
例如,如果远程对象“obj”具有“updateValue()”方法并且客户端A通过存根对象运行它,那么具有真实“obj”的服务器是否可以发送告知客户端A,B的事件, C等......对象已更新?
答案 0 :(得分:1)
RMI是一种客户端 - 服务器技术,RMI通道可用于与服务器上的远程对象通信,但服务器无法回调客户端。
然而,如果您明白我的意思,那么就没有什么能阻止您拥有两个RMI频道,以便双方充当客户端和服务器。
我们这样做是为了向连接到中央服务器的桌面应用程序发送通知,它运行正常。桌面应用程序导出(以RMI的说法)回调存根,连接到中央服务器,并在服务器上注册回调存根。然后,服务器可以向所有连接的桌面应用程序发送通知当然,您需要设置网络基础设施(防火墙等),以便可以进行双向连接。所以是的,我会说这是可能的,但需要比单一的单向通道更多的努力。
我只能快速查看this article,但它似乎说明了这个想法(如果不是这样,请告诉我,我确信我可以找到此用例的代码段)。
其他替代方案包括轮询或JMS,如另一个答案所述。
答案 1 :(得分:0)
您所描述的是“push”机制,它不是RMI的一部分。您可以轻松做的是某种“pull”机制,其中对象A,B,C等轮询服务器以查找任何新事件。但这也不是RMI事实上的一部分。您必须实现另一个名为getNewEvent()的方法,该方法每X秒调用一次服务器以了解是否发生了新事件。
答案 2 :(得分:0)
您可能希望查看事件通道/ Java消息传递服务(JMS) - 我认为这几乎就是您所说的。它是J2EE的核心功能,但JMS解决方案可以在您的系统中使用而无需J2EE的其余部分。
答案 3 :(得分:0)
JMX有一个远程工作的事件API - 没有亲自使用它。
如果您想要非常喜欢,可以在所有客户端计算机上启动RMI服务器,并让它们将存根传递给持有相关对象的“主”服务器。该主服务器可以使用标准侦听器/模型模式调用存根。
如果是我,我会给JMS带来一个动态主题。