【问题标题】:HttpClient: Connection reset after 5 minutes idle, keep-alive possible?HttpClient:空闲 5 分钟后连接重置,可以保持活动状态吗?
【发布时间】:2014-06-11 12:26:11
【问题描述】:

我正在使用HttpClient 向网络服务发送SOAP 请求以查询一些数据。对于某些网络服务参数,网络服务的执行时间超过 5 分钟,5 分钟后我得到一个java.net.SocketException: Connection reset

我认为发生错误是因为连接空闲超过 5 分钟,然后防火墙限制了连接。

有没有办法为 http post 请求发送 keep-alive 包或保持连接活动的东西?(如果可能,我需要客户端解决方案)

如果您在 Google 上搜索 HttpClient keep-alive,您会发现很多关于重用连接的主题。在我的情况下,我只想保持连接直到我得到响应。

执行 SOAP 请求的方法:

def executeSOAPRequest(String url, String content, String soapAction, Integer timeout) {
    def retVal = new SoapResponse();

    PostMethod post = new PostMethod(url);

    RequestEntity entity = new StringRequestEntity(content,"ISO-8859-1","ISO-8859-1");

    post.setRequestEntity(entity);
    post.setRequestHeader("SOAPAction", soapAction);

    HttpClient httpclient = new HttpClient()
    httpclient.setTimeout(timeout)

    try {
        retVal.httpResponse = httpclient.executeMethod(post);
        retVal.httpResponseBody = post.getResponseBodyAsString();
    } catch(Exception e){
        ... exception handling ...
    } finally {
        ... finally stuff ...
    }

    return retVal;
}

目前使用的是HttpClient v3.1。

【问题讨论】:

标签: web-services soap groovy apache-commons-httpclient connection-reset


【解决方案1】:

5 分钟在电信领域是永恒的,现在可以在更短的时间内传输一个千兆比特,保持连接空闲不仅会消耗终端机器的资源,还会消耗路由器和防火墙等中间节点的资源。

所以恕我直言,您不应该尝试让连接保持活动这么长时间,尤其是如果您不管理您正在使用的网络(即,防火墙可以有自己的超时并终止您的连接),您应该减少服务器需要响应的时间,或者使用其他异步通信机制。

【讨论】:

  • 问题是我无法更改系统设计。所以我唯一的选择是保持连接活跃。
  • 如果一个人在月球上行走,也许你可以改变系统设计 :) 你的根本问题是你的系统使用了错误的工具:一把大刀无济于事汤。您可以尝试优化服务器中的响应时间(同样,5 分钟是永恒的),但最终您的系统将需要使用异步调用。
  • 如果它是我自己的系统 - 是的。但在一家大公司里,你不只是自己去改变事情。改变会花钱,如果它起作用,否则就没有钱了。除此之外:很多系统都依赖于这种设计。改变它们将是巨大的努力。如果有人愿意改变它们,那么还有很多其他的东西也必须改变并且具有更高的优先级。
最近更新 更多