【问题标题】:Query on ThreadSafeClientConnManager (Apache HttpClient 4.1.1)查询 ThreadSafeClientConnManager (Apache HttpClient 4.1.1)
【发布时间】:2012-05-19 02:39:31
【问题描述】:

我正在使用 ThreadSafeClientConnManager Apache HttpComponenets-Client4.1.1 用于我的连接池。

当我将连接释放回池时,我会说:

cm.releaseConnection(client,-1,TimeUnit.SECONDS); cm.closeExpiredConnections(); cm.closeIdleConnections(20, TimeUnit.SECONDS);

[这里cm是ThreadSafeClientConnManager的对象] 并且如 javadoc releaseConnection(ManagedClientConnection conn, long validDuration,TimeUnit timeUnit) 中所述,将有效持续时间设置为 -ve (

但是当我看到服务器日志时,我发现:

org.apache.http.impl.conn.DefaultClientConnection] 连接关闭 2011-08-17 14:12:48.992 调试其他 Thread-257 org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager 释放的连接不可重用。 2011-08-17 14:12:48.992 调试其他线程 257 org.apache.http.impl.conn.tsccm.ConnPoolByRoute 释放连接 [HttpRoute[{}->http://server-name:port][null] 2011-08-17 14:12:48.992 调试其他线程 257 [org.apache.http.impl.conn.tsccm.ConnPoolByRoute] 通知没有人,没有等待线程 2011-08-17 14:12:48.993 调试其他线程 257 [org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager] 关闭过期连接 2011-08-17 14:12:48.993 调试其他线程 257 [shaded.org.apache.http.impl.conn.tsccm.ConnPoolByRoute] 关闭过期连接 2011-08-17 14:12:48.993 调试其他线程 257 [shaded.org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager] 关闭连接空闲时间超过 20 秒

我在日志中看到“已释放的连接不可重用” 这是否意味着“-1”没有使连接可重用并且连接被关闭而不是返回池? 如果可以,任何人都可以建议我如何使其可重复使用。

提前致谢。

【问题讨论】:

    标签: java apache-httpclient-4.x


    【解决方案1】:

    默认情况下,释放回管理器的 HTTP 连接被认为是不可重用的。如果连接保持一致状态,则应在释放回管理器之前使用ManagedClientConnection#markReusable() 将其标记为可重用。

    【讨论】:

    • 您好,ManagedClientConnection.setSocketTimeout(10000) 将确保如果连接未在 10 秒内释放,则会发生超时。之后连接会关闭还是重新回到池中?
    • 不,如果您直接使用 ThreadSafeClientConnManager,它不会。您有责任通知连接管理器该连接不再使用(或可用)。
    猜你喜欢
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 2012-08-19
    相关资源
    最近更新 更多