簡體   English   中英

無法編碼來自服務器的RMI客戶端回調-UnmarshalException ClassNotFoundException

[英]Having trouble coding RMI client callback from server - UnmarshalException ClassNotFoundException

我將盡力使這篇文章盡可能小,以便在需要時添加更多信息和代碼。

場景:我正在編寫一個服務器/客戶端應用程序來跟蹤公司中我們的某些流程,因此用戶將根據工作流創建小的標簽,這些標簽將從一個用戶的屏幕轉到另一個用戶的屏幕(使用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和策略文件。 盡管我必須將Hibernate jars包含在客戶端中以解決其他異常(解決方案在SO上找到)。

在客戶端連接到服務器並請求數據工作之后,我開始將回調編碼到客戶端(服務器也必須將數據推送到客戶端)。 所以這就是我現在停留的地方。

這是我進行回調的方式(客戶端的行為類似於服務器):

  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文件(也嘗試不成功),而我被困在這里。

我不明白為什么服務器只需要接口就抱怨實現類。 任何幫助深表感謝。 謝謝。

經過幾個小時的努力,我終於找到了問題。

ClientCallbackHandlerImpl類未擴展 UnicastRemoteObject 之后,代碼運行順利。 謝謝閱讀這篇文章並想到了一些事情的人。

PS:我知道這看起來像菜鳥的錯,但是我避免進行代碼復制/粘貼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM