1

サーバーとその機能に接続するためのURLが提供されています。

URLの例:rmi://(host):(port)/rule

関数の例: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クライアントでインターフェイスを呼び出す必要がありますか?なぜキャストできないのですか?インターフェイスに何か問題がありますか?

4

1 に答える 1

0

次のいずれかを行う必要があります。

  1. クライアントにSpringJARファイルをインストールします(これを修正するためClassNotFoundException

  2. コードベース機能(同上)を使用します。これは、SecurityManagerの復元も意味しますが、独自に作成するべきではありません。RMISecurityManager適切な.policyファイルを使用して作成するか、または

  3. Springの代わりにストレートRMIを使用して、リモートオブジェクトをエクスポートします(根本的な原因を排除するため)。Springについては何も知りませんが、リモートオブジェクトを拡張してレジストリに自分で拡張するだけUnicastRemoteObjectですrebind()

于 2013-03-21T02:31:22.467 に答える