在从服务器编码RMI客户端回调时遇到问题 - UnmarshalException ClassNotFoundException

时间:2013-03-05 20:26:23

标签: java callback client-server rmi

我会尽量保持这篇文章尽可能小,以便在需要时添加更多信息和代码。

场景:我正在编写一个服务器/客户端应用程序来跟踪公司中的一些流程,因此用户将根据工作流程创建从一个用户的屏幕到另一个用户(使用Swing编写的客户端)的小标签

我正在运行本地Glasfish 3.1服务器(在Eclipse中)和MySql。在服务器上,我正在运行Spring MVC和Spring Data + Hibernate。

属性文件包含此信息以便于更改:

rmi.serverPort = 1971
rmi.clientPort = 2010

在服务器启动期间,有一个bean设置RMI环境,如下所示:

  @Autowired
  private RmiData rmiData;
  @Autowired
  private DataRequestHandler dataRequestHandler;
  @Autowired
  private ConnectionRequestHandler connectionRequestHandler;
  .
  .
  .

  LocateRegistry.createRegistry(rmiData.getServerPort());
  String rmiUrl = "rmi://" + rmiData.getHost() + ":" + rmiData.getServerPort() + "/";
  Naming.rebind(rmiUrl + "ConnectionRequestHandler", connectionRequestHandler);
  Naming.rebind(rmiUrl + "DataRequestHandler", dataRequestHandler);

服务器包含两个处理程序的接口和实现,客户端只有接口。

这不使用SecurityManager,也不使用Policy文件。虽然我不得不将Hibernate jar包含在客户端中以解决其他异常(解决方案在此处找到)。

在客户端连接到服务器并请求数据工作之后,我开始将回调编码到客户端(服务器也必须将数据推送到客户端)。所以这就是我现在被困住的地方。

以下是我如何进行回调(客户端就像服务器一样):

  private ClientCallbackHandler clientCallbackHandler = new ClientCallbackHandlerImpl();
  .
  .
  .

  LocateRegistry.createRegistry(rmiData.getClientPort());
  String rmiUrl = "rmi://localhost:" + rmiData.getClientPort() + "/";
  Naming.rebind(rmiUrl + "ClientCallbackHandler", clientCallbackHandler);

服务器只包含客户端接口,客户端同时具有处理程序的接口和实现。

所以当服务器执行

  String rmiUrl = "rmi://" + clientHost + ":" + clientPort + "/";
  clientCallbackHandler = (ClientCallbackHandler)Naming.lookup(rmiUrl + "ClientCallbackHandler");

我收到以下异常在服务器上:

  SEVERE: java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
java.lang.ClassNotFoundException: br.com.affair.socontrol.rmi.ClientCallbackHandlerImpl (no security manager: RMI class loader disabled)

我正在避免安装SecurityManager和Policy文件(也试过没有成功),我就被困在这里。

我无法理解为什么服务器一旦需要它就是接口就会抱怨实现类。任何帮助深表感谢。感谢。

1 个答案:

答案 0 :(得分:1)

经过几个小时的努力,我终于找到了问题。

ClientCallbackHandlerImpl类不扩展 UnicastRemoteObject 。 之后代码运行顺利。谢谢你阅读这篇文章并想到了什么。

PS:我知道它看起来像是菜鸟的错,但我避免进行代码复制/粘贴。