正如我編碼RMI系統,我遇到了與例外的問題,在客戶端RMI UnmarshalException
Exception in thread "main" java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: com.cs.entity.LectureCourse
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:178)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)
at $Proxy1.getNamedClass(Unknown Source)
at com.cs.test.ClientCRUD.main(ClientCRUD.java:40)
爲是使用我已經檢查,以RMI codebase特徵,一類,應該由客戶端在運行時下載確保
- 的在服務器VM參數代碼庫的設置是否正確,並
- 客戶VM選項-Djava.security.policy =也設置正確。
- -Djava.rmi.server.hostname也被用來確保註冊表得到的東西正確
當我跑在它的工作原理,但在例外客戶端時,單獨的物理機擁有服務器顯示同一節點客戶機和服務器和客戶分開。
有沒有人看到過這個問題?請幫助...
@EJP
以下是我用來啓動RMI註冊表中的代碼(Tomcat的內部7 contextInitialized)
final String value = "http://192.168.1.11:8080/csl/";
System.out.println(value);
System.setProperty("java.rmi.server.codebase", value);
registry = LocateRegistry.createRegistry(8899)
,這是我用來查找在客戶端註冊表中的代碼
System.setSecurityManager(new RMISecurityManager());
final String HOST = "192.168.1.11";
final int port = 8899;
final Registry registry = LocateRegistry.getRegistry(HOST, port);
我認爲他們正常工作,但這個錯誤讓我很沮喪了很多
我想我找到問題所在。如前所述,RMI註冊表是在Tomcat 7 contextInitialized方法中啓動的,應在啓動Web項目時調用它。事實證明,如果RMI服務器位於獨立的主應用程序中,它的相同代碼工作得很好。根據我在不同的RMI服務器配置多次試驗,我得出的結論是
- 的Tomcat 7 contextInitialized方法做一些不同的東西,然後普通的Java程序主
- 我不知道,但基本代碼似乎工作,只有當URL(我使用web服務器)指示特定的jar文件而不是目錄。 (這可能是我誤解教程或類似的東西)
所以這個問題原來是爲什麼Tomcat 7不啓動RMI註冊表不同?我仍然對
@Santosh如果您正在討論關於RMI代碼庫功能的教程,請點擊此鏈接http://docs.oracle.com/javase/1.5.0/docs/guide/rmi/codebase.html#section5 – Korben
@Santosh You顯然不知道RMI代碼庫功能是什麼,所以請留下那些問題。如果你有自己的問題,請問問題。 – EJP
你是如何運行註冊表的?代碼庫功能的最佳方式是通過LocateRegistry.createRegistry()在服務器JVM中運行它。否則,您可能會遇到在註冊表中丟失代碼庫註釋的問題。否則,您需要檢查您的代碼庫服務器日誌,以查看是否收到任何請求:如果是,爲什麼他們被拒絕;如果沒有,爲什麼不。 – EJP