2012-02-11 47 views
1

我有一个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过程似乎“用尽了”一些资源(套接字?),抛弃了每个错误,直到没有更多可用的东西。有没有人见过这个,并有解决方案明显?我在这件事上做了很多搜索,没有发现任何人有同样的问题。

在此先感谢! 约翰

+0

当你的系统进入该楔形状态,你做了一个堆栈转储或堆转储?这些可能会指向各种资源耗尽问题。此外,您应该在反弹tomcat之前列出计算机上的开放套接字。 – jtahlborn 2012-02-11 20:43:02

+0

netstat -ano确实在TIME_WAIT状态中显示了很多TCP套接字。大多数PID的PID是0,这是系统空闲过程。那是什么意思? – Squidious 2012-02-14 18:58:33

回答

0

我曾经遇到过一种情况,那就是TCP/IP堆栈中的插槽用于处于TCP_WAIT状态的连接,在操作系统中存在一些硬限制,您可以应对这些限制。找出限制的方法是使用像netstat这样的工具,如果你在Windows服务器上运行,你可以使用sysinternals的一些工具。

你的问题的解决方案可以被称为巡回制动器设计模式,其在书中解释称为http://pragprog.com/book/mnee/release-it

与断路器格局发生的事情是,你要通过断路器的远程web服务流程调用当断路器处于打开状态时,如果太多的远程服务呼叫失败,这将打开断路器。断路器处于打开状态时,断路器代码中的电话将立即失效,通常情况下,您可以编程断路器重试,看看是否会再次打开。无论如何,这本书比我刚刚给你的简短的一本书有更好的解释。

https://bitbucket.org/asaikali/circuitbreaker/具有断路器图案的开放源码样本实现。

+0

netstat -ano确实在TIME_WAIT状态中显示了很多TCP套接字。大多数PID的PID是0,这是系统空闲过程。那是什么意思? – Squidious 2012-02-14 18:58:24

+0

我在这里发现了一些很好的信息(和建议):http://wiki.apache.org/HttpComponents/FrequentlyAskedConnectionManagementQuestions 我实现的代码更改是'urlConn.setRequestProperty(“Connection”,“close”);' 接下来的停运后,我将在这里报到的代码更改是否实际修复。 – Squidious 2012-02-14 20:00:26

+0

由于此修复程序已投入生产,我们只有一次重大停机,但在停机1小时后,我们的服务器恢复良好。修复看起来不错。 – Squidious 2012-03-11 21:35:36

相关问题