[英]RMI client cannot lookup server - java.rmi.UnmarshalException
[英]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.