【问题标题】:Mechanism to generate RMI automatically from Abstract Syntax Tree?从抽象语法树自动生成 RMI 的机制?
【发布时间】:2014-06-21 20:10:28
【问题描述】:

我正在为我的 JAVA 论文做一个项目,该项目需要从抽象语法树自动生成 RMI。我使用 RMI 作为

`public int createProcess(CompilationUnit cu){
   //Some Code Here
 return processid;
   } `       

用于在每个节点上从 AST 生成 RMI。它会自动从 AST 生成 Interface 文件和所有 java 文件,并将所有方法放入这些文件中。我可以使用进程生成器执行javacrmic <remote-class>rmiRegistry 命令。但是

  1. 进程完成后如何销毁和解除绑定远程对象?我是否必须将此代码放在控制退出的每个文件的末尾?

     public void exit() throws RemoteException
      {
      try{
       // Unregister ourself
          Naming.unbind(mServerName);
    
    // Unexport; this will also remove us from the RMI runtime
        UnicastRemoteObject.unexportObject(this, true);
    
       }
        catch(Exception e){}
    
       }
    
  2. 我是否必须在每个远程方法/类创建后执行 rmiRegistry,否则它会自动将以后的远程方法/类添加到注册表中,如果它已经处于执行状态(意味着如果 processbuilder 已经在执行命令“rmiRegistry”)?例如,如果 nodeA 在 nodeB 上创建一个 Process1(RMI 类),然后通过 Processbuilder 使用命令执行它,则 rmiRegistery 将处于运行状态。现在,如果 NodeA 想在 NodeB 上创建另一个 Process2,我是否必须停止该 rmiRegistery 实例并重新运行它,或者不需要这样做,Registery 会自动检测并添加新绑定?

  3. 所有的 RMI 会在同一个端口上运行吗?意味着如果我创建 process1 并将其与 localhost/process1 和 process2 与 localhost/process2 绑定,我们可以通过相同的端口访问它们吗?

我是第一次与 RMI 合作,因此之前没有任何经验或知识。

抱歉,我的问题似乎不清楚,所以我试图通过编辑进行更多解释? 跟着本教程Link

【问题讨论】:

  • 您不需要调用 rmic。 RMI 能够动态生成其存根。
  • @StuartMarks 先生,我正在使用本教程mrbool.com/…
  • @StuartMarks 先生,这是否意味着我必须只编译文件然后启动 rmiRegistry ?
  • 不再需要(自 Java 5,2004 年发布)使用 rmic 来生成存根。它们现在是动态生成的。事实上,今年早些时候发布的 Java 8 已经弃用了rmic。只需编译远程接口及其实现,导出它,UnicastRemoteObject 就会自动创建存根。 Oracle RMI tutorial 比您使用的更新。
  • 注册表是一个独立于存根的问题。如果你 fork 一个rmiregistry 进程,你只需要这样做一次。但正如 EJP 所指出的,使用LocateRegistry.createRegistry 在同一个 JVM 中创建注册表服务可能更容易,避免了派生子进程的需要。

标签: java rmi processbuilder


【解决方案1】:

1 进程完成后如何销毁和解除绑定远程对象?

请参见 2,但我不知道您为什么要这样做。只需让它们存在并绑定到注册表即可。

2 我是否必须将此代码放在每个控制退出的文件的末尾?

是的,如果你想让它执行,否则不。不过不要生成空的 catch-blocks。

3 我是否必须在每次创建远程对象后执行 rmiRegistry

不,您必须在包含过程开始时启动一次。最简单的方法是通过 LocateRegustry.createRegistry()。

【讨论】:

  • 抱歉,我想我必须编辑我的问题以使其更清楚。 BTW LocateRegustry.createRegistry() 会将所有对象绑定到同一个端口。在我的论文中,我将从其他节点运行多个进程,以便使其更易于管理和清洁,我可能必须删除对象,这样如果将来再次创建相同的进程,我们可以将其绑定到同一个注册表。谢谢:)
  • 重新编辑,注册表不会“自动检测新绑定”。新绑定由 registry.bind()/rebind() 创建。我不明白你上面关于不同端口的评论。您不需要在每个主机的不同端口上运行多个注册表。
  • 我不擅长解释,但让我尝试一下,每次调用都会生成服务器代码和客户端代码,以在两个节点上创建进程。 (正确的 ?) 。在每个客户端代码中,我是否必须调用相同的端口,或者每个注册表都会将自己绑定到新端口?同样正如 stuart 现在建议的那样,我只需要编译 RMI 代码。然后根据操作系统执行start rmiregistryrmiregistry。但是现在另一个问题是,如果我在两个节点上生成另一个服务器客户端代码,而 rmiregistry 已经处于执行状态或其中一个代码已经在运行,我是否已经执行了单独的 TBC...
  • 续。 rmiregistry 的实例或杀死第一个然后重新执行 rmiregistry 或保持 rmiregistry 活着,它会检测到新的代码执行并处理它??或者根据您的建议,我可以将LocateRegustry.createRegistry() 添加到每个生成的代码中,当执行更新的代码时,它也会处理所有以前的绑定??
  • 我已经告诉过您,您不需要在每个主机的不同端口上运行多个注册表,这些关于多个注册表和不同端口的问题根本没有意义。 @stuartmarks 关于存根是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
相关资源
最近更新 更多