java - Spring/RMI 服务器错误

标签 java spring rmi socketexception connectexception

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

尽管完全令人困惑,但直到昨天为止,它都工作得很好,现在线程在启动时失败,尽管我们尽了最大努力将日志记录添加到组合中,但我们遇到了困难。这是我们能够在日志中找到的唯一异常:

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 线程。根据此错误的措辞,是否有人知道可能导致此“连接被拒绝”错误的原因?

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

最佳答案

我会将我的评论移至此答案。

日志中的所有内容都表明问题出在您连接到端口 8888 的另一台计算机上。netstat 结果证明没有进程正在监听该端口 - 因此日志中出现连接错误.

下一步我要检查另一台计算机(或其他 JVM)上的应用程序是否正在运行(例如 ps ax|grep java)。如果确实如此,请检查其日志以获取无法启动 RMI 服务的线索,如果没有,请启动它。

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

关于java - Spring/RMI 服务器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10994770/

相关文章:

java - 如何在 JVM 分析器中获得类似于 android Traceview 中的 "Timeline Panel"的 View ?

java - Spring MVC 表单操作未映射到 Controller

java - 没有RMI的两个JVM之间的通信?

java - 使用rmi注册表确定java rmi远程对象主机的ip

java - RMI over SSL - 通信速度慢

java - 自动缩进 Java 和 HTML 文件的脚本或程序

java.util.ConcurrentModificationException - 如何使用迭代器进行删除

java - 结合 CMT 和 BMT 的事务管理(BMT 情况下数据提前提交)

Spring JdbcTemplate batchUpdate处理异常

java - 将 Spring Boot jar 部署到 Azure,并使 Azure 重新启动