ServerClass 或单独的 ImplementationClass 中的 RMI 接口实现

RMI interface implementation in ServerClass or seperate ImplementationClass

我已经阅读了oracle tutorial关于RMI实现和书中关于RMI的章节:"Beginning Java 8 APIs, Extensions, and Libraries - Swing, JavaFX, JavaScript, JDBC, and Network Programming APIs."

在 oracle 教程中,远程接口的实现直接发生在服务器中 class,而在书中以及该论坛上的许多其他问题中,作者使用单独的实现 class在服务器 class.

中实例化的接口

我的一个问题是直接在服务器中实现远程接口是否是一种好的做法class。

在我的例子中,我必须能够通过客户端暂停和恢复服务器。我已经实现了这两种方法,它们确实有效。

界面:

public interface MyRemote extends Remote {

  boolean isSuspended() throws RemoteException;

  void resumeServer() throws RemoteException;

  void suspendServer() throws RemoteException, InterruptedException;
}

为了暂停服务器,我只是在 ServerClass

中设置了一个 boolean suspended;

使用额外的 RemoteImplementation class,我无法访问该变量。我可以从 ServerClass 调用静态方法,例如从 RemoteImplementation class.

调用 ServerClass.suspendSrv()

直接在 ServerClass 中实现 MyRemote 接口时,我可以通过实现的方法直接访问变量。

静态方式让我有点吃惊,因为我什至可以在没有服务器的情况下调用这些方法 运行 并且可能还有一些我现在无法想到的其他问题。

最后只剩一题了:

不直接在 ServerClass 中实现 MyRemote 接口有什么缺点吗?

非常感谢您的想法!

任何适合你的:对RMI来说无所谓。

我一直想知道为什么这么多 RMI 示例使用单独的主 class 来启动服务器。除非您同时启动多个远程对象,否则这真的毫无意义,这是不寻常的。大多数情况下你只有一个,你通过第一个获得任何其他的。将其放入示例中会给人一种错误的印象,即您必须那样做。你没有。