2012-06-12 97 views
1

我们有一个部署到Tomcat(6.0.35)的Spring MVC Web应用程序(WAR),它在部署时启动一个单独的JVM内的线程(不要问为什么 - 而不是我的设计)然后通过RMI通过端口8888Spring/RMI服务器错误

线程通信,尽管被完全convoluded,这是工作完全正常,直到昨天,现在的线程在启动时,尽管添加登录到混音我们最大的努力失败了,我们正在撞墙。这是唯一的例外,我们可以在日志中找到:

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是Spring MVC Controller,负责踢了这个守护进程/催生RMI线程。基于这个错误的verbage,有没有人有任何想法什么可能会导致这种“连接被拒绝”的错误?

运行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 
+0

您确定您尝试连接的端口没有被封锁或关闭吗? –

+1

这些日志似乎来自Web应用程序JVM,它基本上抱怨说它无法通过RMI连接。你需要调查其他服务的日志,以及为什么它没有启动/不在8888上监听。 – maksimov

+0

@indyaah - 我对linux不太熟悉 - 我可以使用哪些命令来判断端口8888是否被阻止/关闭? – IAmYourFaja

回答

2

我会提出我的意见,这个答案。

日志中的所有内容都表明问题出在您连接到端口8888的其他机器上。netstat结果证明没有进程在该端口上侦听 - 因此日志中的连接错误。

下一步我要检查其他机器(或其他JVM)上的应用程序是否在运行(例如ps ax|grep java)。如果确实如此 - 请检查其日志中的线索,看看它为什么无法启动RMI服务,或者它没有启动它。

通常,如果某个应用程序无法打开套接字,那是因为其他应用程序已经在使用该端口。情况并非如此。可能是同一个应用程序的两个实例已经启动:第一个应用程序占用了8888端口,第二个应用程序不能占用8888并失败,然后关闭了第一个应用程序。毕竟你最终没有人在港口上聆听。

+0

Tomcat Web应用程序和这个其他线程都位于同一台服务器计算机上,并且都输出到相同的日志文件。 – IAmYourFaja

+0

在我看来,我需要排除系统级别是否阻塞/关闭端口 - 如果这是不可能的,请解释原因!但是,这是唯一有意义的事情发现没有代码变化昨天传播... – IAmYourFaja

+0

现在你的编辑是有道理的!我们的buildscript会做一些奇怪的事情,并重新启动Tomcat作为其构建步骤之一(而不是热部署WAR)。如果一个失败的应用程序“使用”(占用)它可能释放一个端口吗? – IAmYourFaja

0

没有任何人有任何想法可能是造成这个“连接被拒绝”的错误?

这是正确的,在堆栈跟踪:

java.lang.NoClassDefFoundError: org/springframework/web/context/ContextCleanupListener 

部署中缺少该类,即它有JAR文件

+0

不知道是否是这样。基本上'ContextLoaderListener'和'ContextCleanupListener'应该在同一个JAR的''spring-web-x.x.x.jar'包中,所以这个错误很奇怪,但怀疑是造成这个问题的原因。 – maksimov

+0

我同意maksimov - 就像我说的一样*自昨天以来没有任何变化(没有部署,没有构建,没有任何变化),所以类路径没有改变。这只是停止工作。 – IAmYourFaja

+0

@maksimov如果这不是它为什么抛出异常?为什么它出现在堆栈跟踪*下面*'连接被拒绝'异常? – EJP