2013-08-13 2 views
0

Я пишу сервлет, который может вызвать вызов rmi. Я пишу сервер RMI и тестировал его с помощью java swing-клиента, и все идет хорошо. Но у меня проблема с использованием сервлета. Когда пользователь открывает основную веб-страницу, сервлет автоматически вызывает метод rmi для получения некоторой информации о базе данных, а затем создает веб-страницу для показа. Когда пользователь нажимает определенную ссылку, выстрелила другой сервлет, вызывать другой метод RMI, я получить ошибку:вызывать метод 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) 

Я думаю, это может быть вызвано тем, как я подстановки реестра и передать его в serlvets. Для избегаете писать каждый раз подстановки RMI код внутри каждый сервлета, я думал сделать класс (как ConnectionManager используется на JDBC Clien) класс, запрос реестра и вернуть его обратно в ссылающийся сервлет:

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. Как я могу решить эту проблему?

+1

Действительно ли сервер на 192.168.1.101 прослушивает порт 22222? На правильном интерфейсе? Можете ли вы проверить telnet и посмотреть, работает ли он? – hexafraction

+0

уверен, что он работает хорошо. Кроме того, если он не работает, то первый вызов rmi должен завершиться неудачно. – giozh

+0

Вам действительно нужно постоянно переназначать статическое поле 'interface_engine'? –

ответ

0

Connection refused to host: 192.168.1.101 ... at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)

Там нет регистрации работает на 192.168.1.101, в этом случае на порт 22222, как вы назвали LocateRegistry.getRegistry("192.168.1.101", 22222).

Может быть, ваши выходы реестра после первого вызова. Если вы создаете его на сервере с LocateRegistry.createRegistry() и не сохраняете результат в статическом поле, он может быть собран в мусор.

Смежные вопросы