【发布时间】:2014-06-21 20:10:28
【问题描述】:
我正在为我的 JAVA 论文做一个项目,该项目需要从抽象语法树自动生成 RMI。我使用 RMI 作为
`public int createProcess(CompilationUnit cu){
//Some Code Here
return processid;
} `
用于在每个节点上从 AST 生成 RMI。它会自动从 AST 生成 Interface 文件和所有 java 文件,并将所有方法放入这些文件中。我可以使用进程生成器执行javac、rmic <remote-class>、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 使用命令执行它,则 rmiRegistery 将处于运行状态。现在,如果 NodeA 想在 NodeB 上创建另一个 Process2,我是否必须停止该 rmiRegistery 实例并重新运行它,或者不需要这样做,Registery 会自动检测并添加新绑定?
- 所有的 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