好的,我得到了如何使用RMI将一个单一服务器对象与一个众所周知的名称绑定,以便其他JVM可以找到它。
假设我有许多进程,每个进程运行一个JVM,每个进程都创建一个支持FooRemote
接口的对象,我希望通过RMI公开它。每个进程都有一个不可预测的生命周期,对应于某些东西,无论是来自用户输入还是资源的可用性。
如何在不获取命名冲突的情况下绑定这些内容?会使用JNDI帮助吗?
实际上,我希望做的是拥有一个类似对象的池,每个对象位于不同的JVM上(这样做的原因很重要,但超出了本问题的范围)。我需要一个客户端能够枚举哪些对象可用,并选择一个进行进一步的交互。
(我强调单独的JVM的原因是,如果它们都在同一个JVM中,我可以只有一个处理组池的单例管理器,并通过管理器访问所有组实例。但我可以'如果组池由单独的JVM中的独立实例组成,则执行此操作。)
答案 0 :(得分:2)
它不是很有效,但您可以在每个JVM中拥有一个单独的管理器(工厂),它可以创建和枚举池中属于该JVM的所有对象。
你显然必须要求所有人全面了解情况。根据您的实际使用情况,这可能是您想要的,也可能不是。虽然它是准确的,但网络流量和延迟会严重影响性能,因此,如果您查询池的次数远远超过更新池,请不要尝试此操作。
另一种解决方案是将客户端变为服务器,并允许服务器在池中对象的状态发生变化时调用回调。此解决方案在网络流量方面可能更有效但更新更少:如果其中一个服务器突然终止,则在您实际尝试使用它们并失败之前,它的对象将不会从池中删除。这种行为可以通过keepalive调用和超时来改进,以跟踪服务器的可用性,但显然是以增加流量和解决方案的复杂性为代价。