我已提供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客戶端右側接口?爲什麼它不能被施放?接口有問題嗎?
爲什麼安全管理員?只要刪除它。 – EJP 2013-03-20 11:12:20
嗨EJP,非常感謝回覆。我已經更新了我的第一篇文章。刪除了安全管理器並得到了異常。可以請再次幫忙嗎? – angel 2013-03-21 02:22:59