【问题标题】:How to force disconnection in commons-httpclient?如何在 commons-httpclient 中强制断开连接?
【发布时间】:2010-02-04 12:34:05
【问题描述】:

我使用 commons-httpclient 向 Web 服务器发送查询。 Web 服务器从不关闭连接,但与连接上下文相关的内存泄漏很小。

因此,我想不时关闭持久连接(例如每个 X 查询),但我没有找到任何方法来做到这一点。我使用 MultiThreadedHTTPConnectionManager

我可以使用 MultiThreadedHTTPConnectionManager.closeIdleConnections(very_small_delay),但这不是很可靠:如果我的 Java 代码有很多工作要做,那么可能没有连接是空闲的,因为总是有其他线程在等待空闲连接.

谢谢,

【问题讨论】:

    标签: java apache-commons-httpclient


    【解决方案1】:

    在执行一个方法后,比如说GET,你可以读取响应的HttpStatus号,来决定是否需要调用method.releaseConnection()。

    或者如果你知道你想关闭哪个连接,你可以试试

    MultiThreadedHTTPConnectionManager
    void    releaseConnection(HttpConnection conn) 
    

    好的,我认为您有某些理由要“终止”连接。假设您有连接,即您想要关闭的 HttpConnection 对象。这种方法有帮助吗?

    HttpConnection
    public void close()
    
        Closes the socket and streams. 
    

    【讨论】:

    • 嗨,调用 releaseConnection() 会将连接放回池中,这不是我想要的,因为它会保持活动状态。但是,如果我不调用releaseConnection(),那么池会认为我还在使用它,而不是创建另一个,基本上导致死锁。
    【解决方案2】:

    你打电话给method.releaseConnection()

    http://hc.apache.org/httpclient-3.x/threading.html#Connection_Release

    【讨论】:

    • 是的,这具有将连接放回池中的正确效果,可以将其重新用于另一个查询。我想要的另一件事是不时明确地终止连接并禁止其重用(执行客户端等效于设置 Apache 的最大保活请求)
    【解决方案3】:

    你能负担得起使用SimpleHttpConnectionManager(boolean alwaysClose)吗?

    httpClient.setHttpConnectionManager(new SimpleHttpConnectionManager(true))
    

    【讨论】:

      【解决方案4】:

      当我使用releaseConnections() 时,CLOSE_WAIT 状态下仍有连接。 releaseConnections后面加closeIdleConnections(0)可以吗?

      这是否意味着即使连接被发送回池以供其他客户端使用但未关闭/释放,然后closeIdleConnections 将关闭它?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-23
        • 1970-01-01
        • 1970-01-01
        • 2015-12-11
        • 1970-01-01
        • 2012-08-16
        相关资源
        最近更新 更多