我有一个Java/JSP的Web应用程序提供了被Tomcat,使Web服务调用了一个合作伙伴网络服务来获取数据。合作伙伴服务中使用的技术是未知的。该合作伙伴网络服务具有经常停电延长它返回一个SocketTimeoutException:的Tomcat Java服务器应用程序不恢复从多个从属java.net.SocketTimeoutExceptions
java.net.SocketTimeoutException: connect timed out
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.net.NetworkClient.doConnect(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.<init>(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.New(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
如果合作伙伴的Web服务有一个短暂的中断,然后迅速地恢复,我的应用程序很好地处理一切。
如果合作伙伴网络服务的延期中断时间超过一个小时,并且我的应用程序有数百个服务调用已经超时,那么在某些时候我的应用程序会达到不能恢复的状态。合作伙伴服务回来,但我的应用程序调用该服务仍导致相同的确切SocketTimeoutException错误。
如果我开始在这一点停止Tomcat,然后一切工作正常后。
我不使用保持HTTP连接。我的代码是关于清理所有对象实例的分析,无论是否发生异常。看起来Tomcat的Java过程似乎“用尽了”一些资源(套接字?),抛弃了每个错误,直到没有更多可用的东西。有没有人见过这个,并有解决方案明显?我在这件事上做了很多搜索,没有发现任何人有同样的问题。
在此先感谢! 约翰
当你的系统进入该楔形状态,你做了一个堆栈转储或堆转储?这些可能会指向各种资源耗尽问题。此外,您应该在反弹tomcat之前列出计算机上的开放套接字。 – jtahlborn 2012-02-11 20:43:02
netstat -ano确实在TIME_WAIT状态中显示了很多TCP套接字。大多数PID的PID是0,这是系统空闲过程。那是什么意思? – Squidious 2012-02-14 18:58:33