0

rmi 呼び出しが可能なサーブレットを作成しています。私は RMI サーバーを作成し、それを Java Swing クライアントでテストしましたが、すべてうまくいきました。しかし、サーブレットで使用するのに問題があります。ユーザーがメイン Web ページを開くと、サーブレットは自動的に rmi メソッドを呼び出してデータベースに関する情報を取得し、表示する Web ページを作成します。ユーザーが別の rmi メソッドを呼び出す別のサーブレットを起動したリンクをクリックすると、エラーが発生します。

java.rmi.ConnectException: Connection refused to host: 192.168.1.101; nested exception is: 
java.net.ConnectException: Connection refused
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:340)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at project.RemoteClass.getEngine(RemoteClass.java:33)
at project.MainServlet.processRequest(MainServlet.java:57)
at project.MainServlet.doGet(MainServlet.java:176)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:146)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)

これは、レジストリを検索してサーブレットに渡す方法が原因である可能性があると思います。各サーブレット内に毎回ルックアップ RMI コードを記述しないようにするために、クラス (JDBC クライアントで使用される ConnectionManager など) を実行して、レジストリをルックアップし、サーブレットの呼び出しに戻すクラスを作成することを考えました。

public class RemoteClass {
    private RemoteClass(){}
    private static Registry registry = null;
    private static RemoteInterface interface_engine = null;
    private static final String rmiAddress = "192.168.1.101";
    private static final int rmiPort = 22222;
    private static final String skeleton = "ProjRMISkeleton";

    public static RemoteInterface getEngine() throws RemoteException {
        registry = LocateRegistry.getRegistry(rmiAddress, rmiPort);
        try {
            interface_engine = (RemoteInterface) registry.lookup(skeleton);
        } catch (RemoteException ex) {
            Logger.getLogger(MainServlet.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NotBoundException ex) {
            Logger.getLogger(MainServlet.class.getName()).log(Level.SEVERE, null, ex);
        }
        return interface_engine;
    }
}

このコードがregistry.lookupメソッドを実行すると、そのエラーが発生します。どうすれば解決できますか?

4

1 に答える 1

0

ホストへの接続が拒否されました: 192.168.1.101 ... at sun.rmi.registry.RegistryImpl_Stub.lookup (不明なソース)

192.168.1.101 で実行されているレジストリはありません。この場合は、呼び出したポート 22222 で実行されています。LocateRegistry.getRegistry("192.168.1.101", 22222).

おそらく、最初の呼び出しの後にレジストリが終了します。サーバーで作成しLocateRegistry.createRegistry()、結果を static フィールドに格納しないと、ガベージ コレクションが発生する可能性があります。

于 2013-08-14T01:44:29.183 に答える