gpt4 book ai didi

java - 在与 RMIServer 不同的主机上运行 RMIRegistry

转载 作者:行者123 更新时间:2023-12-01 05:52:57 25 4
gpt4 key购买 nike

这可能吗? (假设Java 6)

一个人为的/简单的例子来说明我的观点是:

  • 我有一个定义明确且永远不会改变的 RMI 接口(interface)(单个 JAR 文件,无模板参数)
  • 在主机 X 上运行的 RMIRegistry;
  • RMI 服务,它从主机 Y 对其进行registry.rebind()(主机 X 上的 RMIRegistry);和
  • 从主机 Z 执行 RMI 调用的 RMI 客户端

如果可能,我如何在 RMI 服务(主机 Y 上的进程)上指定属性“java.rmi.server.codebase”?

如果主机 A 和 B 是同一台计算机,则当“java.rmi.server.codebase”为“file:///C:/rmiCodebase/myCommonInterface.jar”时,此配置有效

如果主机 A 和 B 位于不同的计算机上,则重新绑定(bind)时会出现以下异常(在主机 Y 上设置相同的“java.rmi.server.codebase”):

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException:

如果主机 A 和 B 位于不同的计算机上,并且我通过 Web 服务器提供接口(interface) JAR(其中“java.rmi.server.codebase”是“http://Y/rmiCodebase/myCommonInterface.jar"OR "http://Z/rmiCodebase/myCommonInterface.jar"),然后我在重新绑定(bind)时遇到这个略有不同的错误:

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
java.rmi.AccessException: Registry.Registry.rebind disallowed; origin /10.0.190.25 (host Y) is non-local host

我有点困惑 - 如果所有 RMI 服务必须在与 RMIRegistry 相同的物理主机上运行(这是我成功工作的唯一事情),这似乎非常有限制

最终,我只希望机器 Z 能够对机器 Y 上运行的服务进行 RMI 调用。我向机器 Y 和 Z 上运行的进程提供 myCommonInterface.jar。我不知道甚至不希望机器 X 必须使用通用(远程)接口(interface)执行任何操作!

虽然以下链接很有用,但它无助于我回答这个问题:http://download.oracle.com/javase/1.4.2/docs/guide/rmi/codebase.html

最佳答案

我的用例非常简单(基本上,使用 RMI 作为命令分布式系统的方式),但我能够避免一起使用注册表。

这是我最终用于 Map-Reduce-miniframework 的解决方法。

之前:

In client:    
remoteMaster = (Master) remoteRegistry.lookup("master");
// Add self to remote registry (BAD!)
Worker stub = (Worker) UnicastRemoteObject.exportObject(this, 15213);
remoteMaster.bind("workerName", stub);

之后:

(在此解决方法中,我们将手动保存 RemoteObject,而不是使用注册表)

In Master:
List<Worker> workers = new List<Worker>();

public void registerWorker(String name, Worker stub) throws RemoteException {
worker.add(stub);
}

保存远程实例后,您可以像任何其他对象一样传递它并调用它。

请注意,仅当您仅将注册表用作临时存储位置(我就是这样)时,此方法才有用,因为您只是通过不将其添加到注册表并保留它来避免“访问限制”本地的。

只是记录我的(有点hacky)解决方案,欢迎评论。

关于java - 在与 RMIServer 不同的主机上运行 RMIRegistry,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4039031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com