Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaRMI和/或JNDI:非单例对象的绑定_Java_Rmi_Jndi - Fatal编程技术网

JavaRMI和/或JNDI:非单例对象的绑定

JavaRMI和/或JNDI:非单例对象的绑定,java,rmi,jndi,Java,Rmi,Jndi,好的,我了解了如何使用RMI绑定具有已知名称的单例服务器对象,以便其他JVM可以找到它 假设我有许多进程,每个进程运行一个JVM,每个进程创建一个支持FooRemote接口的对象,我希望通过RMI公开该接口。每个流程都有一个不可预测的生命周期,该生命周期对应于某些东西,无论是来自用户输入还是资源的可用性 如何绑定这些文件而不产生命名冲突?使用JNDI会有帮助吗 实际上,我希望做的是在单独的JVM上拥有一个类似对象池(这样做的原因很重要,但超出了这个问题的范围)。我需要一个客户端能够枚举哪些对象是

好的,我了解了如何使用RMI绑定具有已知名称的单例服务器对象,以便其他JVM可以找到它

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

如何绑定这些文件而不产生命名冲突?使用JNDI会有帮助吗

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


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

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

很明显,你必须让他们了解全部情况。这可能是您想要的,也可能不是,这取决于您的实际用例。虽然这是准确的,但网络流量和延迟会极大地影响性能,因此,如果查询池的次数远多于更新池的次数,请不要尝试此操作


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

…但这不是一个鸡和蛋的问题吗?假设有5个JVM运行相同的代码,每个JVM中有一个工厂。我应该为每个工厂选择什么RMI绑定名称,以及如何枚举工厂?如果我能回答这些问题,我就可以解决我原来的问题(因为在我的例子中,每个JVM只有一个RMI导出对象)。您可以创建一个子上下文,选择一个随机名称(例如
UUID.randomuid()
),并将该上下文中的对象置于随机名称下。要查找所有这些对象,您可以执行
InitialContext.listBindings()
,这将返回上下文下的所有对象。啊:那么这就解决了问题,那么!那是JNDI,对吗?你能编辑你的答案吗?给我举个例子,或者告诉我一个使用JNDI+RMI和子文本的在线答案吗?这对我来说有点奇怪。可以,但仔细想想,你也可以用一个普通的
注册表
来完成,它有一个
list()
方法。使用您更熟悉的东西可能是一个更好的选择。re:
Registry.list()
——感谢您的参考。。。我认为如果有层次结构,JNDI可能更合适;
Registry.list()
中的一个简单列表只给了我一堆名字供我浏览。我一直想学习JNDI很长一段时间,但似乎找不到一个好的入门参考。