http - Apache HttpClient 仅在同一 HttpContext 中重用连接

标签 http httpclient connection-pooling apache-httpclient-4.x

如何创建仅在同一 HttpContext 中重用连接的 ConnectionReuseStrategy

例如在 HttpContext 中执行请求时,可能会重定向到外部域并返回,为外部域创建新连接,并在返回时重用到原始域的第一个连接。

但是,一旦我完成此 HttpContext,并在新的 HttpContext 中执行相同的请求,即使域相同,它也不应该重用连接。我无法手动关闭 HttpClient 中的所有连接,因为有并行的 HttpContext 线程在运行,它们不应重用彼此的连接。

最佳答案

您可以利用 HttpClient 功能来维护有状态连接 [1]

可以通过在执行上下文中设置唯一标识特定用户的用户 token 来手动管理用户身份

HttpClientContext context = HttpClientContext.create();
context.setUserToken("user 1");

或者使用自定义用户 token 处理程序自动处理所有请求。

此代码片段演示了如何使用线程 ID 使 HttpClient 仅在由同一线程创建时才重新使用持久连接。

UserTokenHandler userTokenHandler = new UserTokenHandler() {

    @Override
    public Object getUserToken(final HttpContext context) {
        return Thread.currentThread().getId();
    }

};

CloseableHttpClient client = HttpClients.custom()
        .setUserTokenHandler(userTokenHandler)
        .build();

[1] http://hc.apache.org/httpcomponents-client-4.3.x/tutorial/html/advanced.html#stateful_conn

关于http - Apache HttpClient 仅在同一 HttpContext 中重用连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22477446/

相关文章:

c# - 使用 HTTPWebRequest 获取远程页面的标题

http - 如何通过代理进行 HTTP/HTTPS GET

java - 在后端处理 PUT http 请求中的可选字段的最佳方法是什么

ruby-on-rails - HTTP Basic Auth 用户名中的 UTF-8 字符损坏

angular - 确保最后一个 http post 在 Angular 中最后到达后端

java - 专有连接 api 的连接池(非 jdbc)

java - Kerberos:通过IP地址访问主机

c# - HttpClient post 在 url 中包含特殊字符 - WinRT

java - 来自 JavaSE 和 JPA 的 DBCP(数据库连接池)

Java 从 reSTLet 资源中访问 ServletContext