Java 从抽象语法树自动生成RMI的机制?

Java 从抽象语法树自动生成RMI的机制?,java,rmi,processbuilder,Java,Rmi,Processbuilder,我正在为我的JAVA论文做一个项目,它需要从抽象语法树自动生成RMI。我使用RMI作为 `public int createProcess(CompilationUnit cu){ //Some Code Here return processid; } ` 用于从每个节点上的AST生成RMI。它将自动从AST生成接口文件和所有java文件,并将所有方法放在这些文件中。我能够使用process builder执行javac、rmic和rmiRegistry命令。但是

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

`public int createProcess(CompilationUnit cu){
   //Some Code Here
 return processid;
   } `       
用于从每个节点上的AST生成RMI。它将自动从AST生成接口文件和所有java文件,并将所有方法放在这些文件中。我能够使用process builder执行javac、rmic和rmiRegistry命令。但是

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

 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){}

   }
我是否必须在每次远程方法/类创建后执行rmiRegistry,或者如果它已经处于执行状态意味着processbuilder已经在执行命令rmiRegistry,它会自动将后面的远程方法/类添加到注册表中?例如,如果nodeA在nodeB上创建一个Process1 RMI类,然后通过Processbuilder使用命令执行该类,则RMIRistery将处于运行状态。现在,如果NodeA想要在NodeB上创建另一个Process2,我是否必须停止rmiregistry的实例并重新运行它,或者不需要这样做,注册表将自动检测并添加新绑定

所有RMI是否在同一端口上运行??也就是说,如果我创建process1并将其与localhost/process1和process2与localhost/process2绑定,我们可以通过相同的端口访问它们吗? 我是第一次与RMI合作,所以没有任何经验或知识

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

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

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

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

 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){}

   }
是的,如果您希望它执行,否则就不是。不过不要生成空的catch块

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


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

您不需要调用rmic。RMI能够动态生成其存根。@StuartMarks先生我正在使用本教程@StuartMarks先生,这是否意味着我必须只编译文件,然后启动RMI注册表?自2004年发布的Java 5以来,不再需要使用rmic生成存根。它们现在是动态生成的。事实上,今年早些时候发布的Java8已经弃用了rmic。只需编译远程接口及其实现,导出它,并将自动创建存根。比您正在使用的更为最新。注册表与存根是分开的。如果您分叉一个注册过程,您只需要这样做一次。但是正如EJP所指出的,在同一个JVM中创建注册表服务可能更容易,从而避免了派生子进程的需要。抱歉,我想我必须编辑我的问题以使其更清楚。顺便说一句,LocateRegustry.createRegistry会将所有对象绑定到同一端口。在我的论文中,我将从其他节点运行多个进程,以使其更易于管理&clean我可能必须删除对象,以便将来再次创建相同的进程时,我们可以将其绑定到相同的注册表。谢谢:如果重新编辑,注册表不会“自动检测新绑定”。新绑定由registry.bind/rebind创建。我不明白你上面关于不同港口的评论。您不需要在每个主机的不同端口上运行多个注册表。我不擅长解释,但让我试试看,每次调用都会生成服务器代码和客户端代码,以便在两个节点上创建进程。对的在每个客户端代码中,我是否必须调用同一个端口,或者每个注册表将自身绑定到新端口?正如斯图尔特现在建议的那样,我只需要编译RMI代码。然后根据操作系统执行启动rmiregistry或rmiregistry。但现在另一个问题是,如果我在两个节点上生成另一个服务器客户端代码,而rmiregistry已经处于执行状态,或者其中一个代码已经在运行,那么我是否必须执行seprate TBC…Cont。rmiregistry实例或先杀死一个,然后重新执行rmiregistry或保持rmiregistry活动,它将检测新代码的执行并处理它??或者根据您的建议,我可以为每个生成的代码添加LocateRegustry.createRegistry,当执行较新的代码时,它还将处理所有以前的绑定??正如我已经告诉您的,您不需要在每个主机的不同端口上运行多个注册表,这些关于多个注册中心和不同端口的问题根本没有意义@斯图尔特马克关于存根的说法是正确的。