Spring/RMI ошибка сервера
У нас есть веб-приложение Spring MVC (WAR), развертываемое в Tomcat (6.0.35), которое запускает поток внутри отдельной JVM во время развертывания (не спрашивайте почему - не мой дизайн), а затем связывается с этим потоком через RMI через порт 8888.
Несмотря на полную нерешительность, до вчерашнего дня это работало совершенно нормально, а теперь поток запускается с ошибкой при запуске, и, несмотря на все наши усилия по добавлению входа в систему, мы попали в стену. Это единственное исключение, которое мы можем найти в журналах:
Jun 12, 2012 3:11:36 AM com.ourapp.ImageController destroy
SEVERE: Shutdown Error: Lookup of RMI stub failed; nested exception is java.rmi.ConnectException: Connection refused to host: localhost; nested exception is:
java.net.ConnectException: Connection refused
Jun 12, 2012 3:11:37 AM org.apache.catalina.core.StandardContext listenerStop
SEVERE: Exception sending context destroyed event to listener instance of class org.springframework.web.context.ContextLoaderListener
java.lang.NoClassDefFoundError: org/springframework/web/context/ContextCleanupListener
at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:80)
at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:3973)
at org.apache.catalina.core.StandardContext.stop(StandardContext.java:4577)
at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1165)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1271)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:296)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1337)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1601)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1590)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.ClassNotFoundException: org.springframework.web.context.ContextCleanupListener
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
... 12 more
ImageController
это весна MVC Controller
это ответственно за запуск этого демона / порожденного потока RMI. Основываясь на подробностях этой ошибки, кто-нибудь имеет представление о том, что может быть причиной этой ошибки "отказано в соединении"?
Запуск netstat -an | grep 8888
(это машина Linux) не выдает никаких результатов, что означает, что на этом порту ничего не прослушивается. Заранее спасибо за любые идеи / предложения, которые приводят к исправлению.
Редактировать: вот еще ConnectionException
мы видим:
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:529)
at java.net.Socket.connect(Socket.java:478)
at java.net.Socket.<init>(Socket.java:375)
at java.net.Socket.<init>(Socket.java:189)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595)
... 74 more
2 ответа
Я перенесу свои комментарии к этому ответу.
Все в ваших журналах говорит о том, что проблема на другом компьютере, к которому вы подключаетесь через порт 8888. netstat
результаты доказывают, что процесс не прослушивает этот порт - следовательно, ошибки подключения в ваших журналах.
Следующий шаг, который я хотел бы сделать, это проверить, работает ли приложение на другом компьютере (или в другой JVM) вообще (например, ps ax|grep java
). И если это произойдет - проверьте свои журналы на наличие подсказок, почему он не смог запустить службу RMI, или если это не так - запустите его.
Обычно, если приложение не может открыть сокет, это связано с тем, что какое-то другое приложение уже использует порт. Это не так в вашей ситуации. Это может быть случай, когда два экземпляра одного и того же приложения были запущены: первое приложение заняло 8888 портов, второе приложение не смогло взять 8888 и завершилось сбоем, а затем первое приложение было закрыто. В конце концов, никто не слушает порт.
Кто-нибудь есть какие-либо идеи, что может быть причиной этой ошибки "отказано в соединении"?
Это прямо в трассировке стека:
java.lang.NoClassDefFoundError: org/springframework/web/context/ContextCleanupListener
В вашем развертывании отсутствует этот класс, то есть файл JAR, в который он входит.