サーバーとその機能に接続するためのURLが提供されています。
URLの例:rmi://(host):(port)/rul
e
関数の例: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();
}
}
}
rmiClientを呼び出すJavaクラス
// 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.AccessControlException:java.security.AccessController.checkPermission(AccessController.java:546)のjava.security.AccessControlContext.checkPermission(AccessControlContext.java:374)のjava.langでアクセスが拒否されました(java.lang.RuntimePermission setContextClassLoader) .SecurityManager.checkPermission(SecurityManager.java:532)at java.lang.Thread.setContextClassLoader(Thread.java:1394)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)atorg.apache。 catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java: 174)org.apache.coyote.http11.Http11Processorで。process(Http11Processor.java:874)at org.apache.coyote.http11.Http11BaseProtocol $ Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) 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 [Catalina]]"の例外java.security.AccessControlException:java.security.AccessControlContext.checkPermission(AccessControlContext.javaでアクセスが拒否されました(java.lang.RuntimePermission setContext ClassLoader) :374)java.securityで。AccessController.checkPermission(AccessController.java:546)at 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)at java.lang.Thread.run(Thread.java:662)core.ContainerBase $ ContainerBackgroundProcessor.run(ContainerBase.java:1559)at java.lang.Thread.run(Thread.java:662)core.ContainerBase $ ContainerBackgroundProcessor.run(ContainerBase.java:1559)at 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
ライブラリにspring-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クライアントでインターフェイスを呼び出す必要がありますか?なぜキャストできないのですか?インターフェイスに何か問題がありますか?