2012-06-12 121 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