2013-03-20 142 views
1

我已提供URL以連接到服務器及其功能。 URL的使用RMI從客戶端調用服務器的方法

例如:rmi://(host):(port)/rul電子商務功能

例如:reloadRule()

基本上,我需要調用從客戶端這reloadRule功能。我嘗試使用Java RMI並創建rmiClient類和接口。

這是我的代碼:

接口

import java.rmi.Remote; 
    import java.rmi.RemoteException; 

    public interface RmiServerIntf extends Remote{ 
      public void reloadRule() throws RemoteException; 
    } 

客戶

import java.rmi.Naming; 

    public class RmiClient { 
      RmiServerIntf obj = null; 

      public void reloadRule() { 
       try { 
        obj = (RmiServerIntf)Naming.lookup("rmi://localhost:8009/rule"); 
        obj.reloadRule(); 
       } catch (Exception e) { 
        System.err.println("RmiClient exception: " + e); 
        e.printStackTrace(); 
       } 
      }  
    } 

的Java類調用rmiClient

// invoke RMI service 

     // Create and install a security manager 
     /* 
     if (System.getSecurityManager() == null) { 
      System.setSecurityManager(new NullRMISecurityManager()); 
     } */ 
     RmiClient cli = new RmiClient(); 
     cli.reloadRule(); 
     System.out.println("Reload Rule"); 

我仍然困惑如何運行這些東西?我試着運行調用rmiClient類,並得到此異常:在java.security.AccessControlContext.checkPermission訪問被拒絕 (java.lang.RuntimePermission setContextClassLoader) (AccessControlContext.java:

java.security.AccessControlException :374) 在java.security.AccessController.checkPermission(AccessController.java:546) 在java.lang.SecurityManager.checkPermission(SecurityManager.java:532) 在java.lang.Thread.setContextClassLoader(Thread.java:1394 ) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) at org.apache.catalina.valves.ErrorRepor tValve.invoke(ErrorReportValve.java:117) 在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) 在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) 在org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874) 在org.apache.coyote.http11.Http11BaseProtocol $ Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) 在org.apache.tomcat。 util.org.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) at org.apache.tomcat.util.threads.ThreadPool $ ControlRunnable.run(ThreadPool.java:689) at java.lang.Thread.run(Thread.java:662) 異常在線程 「ContainerBackgroundProcessor [StandardEngine [卡塔利娜]]」 java.security.AccessControlException:訪問被拒絕 (java.lang.RuntimePermission setContext 類加載器) 在java.security.AccessControlContext.checkPermission(AccessControlContext.java:374) 在java.lang.Thread.setContextClassLoader(Thread.java:1394) at org(java.lang.SecurityManager.checkPermission(SecurityManager.java:532) at java.lang.Thread.setContextClassLoader(Thread.java:1394) at org .apache.catalina.core.ContainerBase $ ContainerBackgroundProcessor.processChildren(ContainerBase.java:1574) at org.apache.catalina.core.ContainerBase $ ContainerBackgroundProcessor.run(ContainerBase。Java的:1559) 在java.lang.Thread.run(Thread.java:662)

可否請您提供一些線索,並指向我正確的方向。謝謝。


更新

我已刪除了安全管理器,並得到此異常:

RmiClient exception: java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    java.lang.ClassNotFoundException: org.springframework.remoting.rmi.RmiInvocationHandler (no security manager: RMI class loader disabled) 
    java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    java.lang.ClassNotFoundException: org.springframework.remoting.rmi.RmiInvocationHandler (no security manager: RMI class loader disabled) 
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source) 
    at java.rmi.Naming.lookup(Naming.java:84) 

東西在我的代碼失蹤?這個錯誤意味着什麼?


更新2

包括我在圖書館彈簧2.5.4.jar。我得到這個例外,那麼:

 RmiClient exception: java.lang.ClassCastException: $Proxy10 cannot be cast to admin.fsms.RmiServerIntf 
     java.lang.ClassCastException: $Proxy10 cannot be cast to admin.fsms.RmiServerIntf 

的問題的根源是在這裏:

 obj = (RmiServerIntf)Naming.lookup("rmi://localhost:8009/rule"); 

我應該叫在RMI客戶端右側接口?爲什麼它不能被施放?接口有問題嗎?

+0

爲什麼安全管理員?只要刪除它。 – EJP 2013-03-20 11:12:20

+0

嗨EJP,非常感謝回覆。我已經更新了我的第一篇文章。刪除了安全管理器並得到了異常。可以請再次幫忙嗎? – angel 2013-03-21 02:22:59

回答

0

你要麼必須:

  1. 在客戶端安裝彈簧JAR文件(以修復ClassNotFoundException

  2. 使用的代碼庫功能(同上),這也意味着恢復了SecurityManager ,儘管你當然不應該自己寫:使用RMISecurityManager並編寫一個適當的.policy文件,或者使用直接RMI而不是Spring來導出遠程對象(到消除潛在的原因)。我對Spring沒有任何瞭解,只是讓你的遠程對象自己擴展到UnicastRemoteObjectrebind()

+0

沒有3,你的意思是在服務器端擴展UnicastRemoteObject?因爲這是別人的工作,我不能修改它。對於沒有1,我從互聯網上搜索這個罐子。我得到這個鏈接[鏈接](http://www.jarfinder.com/index.php/java/info/org.springframework.remoting.rmi.RmiInvocationHandler)。我不確定我應該下載哪一個。只要選擇其中一個會做什麼? – angel 2013-03-21 02:55:19

+0

遠程對象及其在服務器端的實際擴展。如果是別人的工作,應該已經有一個工作的客戶端和客戶端配置。如果沒有,其他人的工作不完整和/或不正確,必須完成,擴展,固定,無論如何。我不知道這個鏈接是否通過列舉大約50個JAR文件開玩笑,但這是一個更大問題的證據,而不是一個解決方案。 – EJP 2013-03-21 08:33:57

+0

EJP,感謝您的幫助。我已經和創建服務器應用程序的人交談過了,他從他那邊改變了,所以我可以使用直接RMI來調用這個方法。現在正在工作。 – angel 2013-03-27 02:56:16

相關問題