HttpClient:闲置5分钟后连接重置,保持活动状态?

时间:2014-06-11 12:26:11

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

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

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

有没有办法为http post请求发送保持活动包或者保持连接活着?(如果可能,我需要一个客户端解决方案)

如果你谷歌搜索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。

1 个答案:

答案 0 :(得分:-2)

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

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