【问题标题】:java RMI and/or JNDI: binding for objects that are not singletonsjava RMI 和/或 JNDI:非单例对象的绑定
【发布时间】:2011-03-24 13:06:00
【问题描述】:

好的,我知道了如何使用 RMI 将单例服务器对象绑定到一个众所周知的名称,以便其他 JVM 可以找到它。

假设我有许多进程,每个进程都运行一个 JVM,每个进程都创建一个支持 FooRemote 接口的对象,我希望通过 RMI 公开它。每个进程都有一个不可预测的生命周期,它对应于某些东西,无论是来自用户输入,还是来自资源的可用性。

如何在不发生命名冲突的情况下绑定它们?使用 JNDI 会有帮助吗?

实际上,我希望做的是拥有一个相似对象池,每个对象都位于不同的 JVM 上(这样做的原因很重要,但超出了这个问题的范围)。我需要一个客户端能够枚举哪些对象可用,并选择一个进行进一步交互。

(我强调单独的 JVM 的原因是,如果它们都在同一个 JVM 中,我可以只使用一个单例管理器来处理组池,并让所有组实例都可以通过管理器访问。但我可以'如果组池由不同 JVM 中的独立实例组成,则不要这样做。)

【问题讨论】:

    标签: java rmi jndi


    【解决方案1】:

    这不是很有效,但你可以在每个 JVM 中拥有一个单例管理器(工厂),它创建并枚举池中属于该 JVM 的所有对象。

    显然,您必须询问他们所有人才能了解全貌。这可能是也可能不是您想要的,具体取决于您的实际用例。虽然它准确无误,但网络流量和延迟会极大地影响性能,因此如果您查询池的次数多于更新池的次数,请不要尝试此方法。

    另一种解决方案是将您的客户端变成服务器,并允许服务器在池中对象的状态发生变化时调用回调。此解决方案在网络流量方面可能更有效,但更新程度较低:如果其中一台服务器突然终止,则在您实际尝试使用它们并失败之前,它的对象不会从池中删除。这种行为可以通过 keepalive 调用和超时来跟踪服务器的可用性来改进,但显然是以增加流量和解决方案复杂性为代价的。

    【讨论】:

    • ...但这不是鸡和蛋的问题吗?假设我有 5 个运行相同代码的 JVM,每个 JVM 中都有一个工厂。我为每个工厂选择什么 RMI 绑定名称,以及如何枚举工厂?如果我能回答这些问题,我就可以解决我原来的问题(因为在我的情况下,每个 JVM 只有一个 RMI 导出的对象)。
    • 您可以创建一个子上下文,选择一个随机名称(例如UUID.randomUUID())并将该上下文中的对象放在随机名称下。要查找所有对象,您可以执行 InitialContext.listBindings(),它将返回上下文下的所有对象。
    • 啊:那么问题就解决了,那么!那是JNDI,对吧?您能否编辑您的答案+给我一个示例或将我指向一个使用带有子上下文的 JNDI + RMI 的在线示例?这对我来说有点奇怪。
    • 会做,但再想一想,你也可以用一个普通的Registry 来做,它有一个list() 方法。使用您更熟悉的东西可能是更好的选择。
    • re: Registry.list() -- 感谢您的参考...如果有层次结构,我认为 JNDI 可能更合适;来自Registry.list() 的平面列表只是给了我一堆名字让我涉水而过。想学JNDI很久了,但是好像找不到好的入门参考。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多