2013-01-16 71 views
1

正如我編碼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特徵,一類,應該由客戶端在運行時下載確保

  1. 的在服務器VM參數代碼庫的設置是否正確,並
  2. 客戶VM選項-Djava.security.policy =也設置正確。
  3. -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服務器配置多次試驗,我得出的結論是

  1. 的Tomcat 7 contextInitialized方法做一些不同的東西,然後普通的Java程序主
  2. 我不知道,但基本代碼似乎工作,只有當URL(我使用web服務器)指示特定的jar文件而不是目錄。 (這可能是我誤解教程或類似的東西)

所以這個問題原來是爲什麼Tomcat 7不啓動RMI註冊表不同?我仍然對

+0

@Santosh如果您正在討論關於RMI代碼庫功能的教程,請點擊此鏈接http://docs.oracle.com/javase/1.5.0/docs/guide/rmi/codebase.html#section5 – Korben

+0

@Santosh You顯然不知道RMI代碼庫功能是什麼,所以請留下那些問題。如果你有自己的問題,請問問題。 – EJP

+0

你是如何運行註冊表的?代碼庫功能的最佳方式是通過LocateRegistry.createRegistry()在服務器JVM中運行它。否則,您可能會遇到在註冊表中丟失代碼庫註釋的問題。否則,您需要檢查您的代碼庫服務器日誌,以查看是否收到任何請求:如果是,爲什麼他們被拒絕;如果沒有,爲什麼不。 – EJP

回答

0

的Tomcat 7 contextInitialized方法的工作做了不同的,那麼普通的Java程序主

當然它中。但是,如果不知道你有什麼具體的期望,就不可能進一步發表評論。

我不確定,但只有當URL(我使用web服務器)指示特定的jar文件而不是目錄時,codebase纔有效。(這可能是我的教程的誤解或類似的東西)

它的工作好了很多,因爲只有一個下載的,你不必灑.class文件都在你的代碼庫服務器:剛部署一個或多個JAR文件。

如果您希望RMI從目錄加載JAR文件而不被明確告知這樣做,它不會。如果你沒有命名JAR文件,它會查找.class文件。

+0

在RMI服務器上沒有任何異常。我以前不知道JAR文件。 – Korben

+0

@Korben大聲哭泣。我沒有問你有關RMI服務器的異常情況。我已經在* codebase *服務器詢問過4-5次* logs *。服務於代碼庫URL中的文件的HTTP服務器。在RMI服務器上不會有任何異常,因爲*您還沒有成功調用它。*當然這很明顯嗎? – EJP

+0

我沒有讓你很好。我忘了提及,代碼庫Web服務器就是我運行RMI註冊的服務器。代碼庫URL是可訪問的,在catalina中沒有發現異常。 RMI調用工作,如果我啓動RMI註冊表使用另一個Java主外部tomcat – Korben