首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache 4.1.4创建新的套接字连接,而不是从连接池重用连接

Apache 4.1.4创建新的套接字连接,而不是从连接池重用连接
EN

Stack Overflow用户
提问于 2020-03-31 14:40:08
回答 1查看 1.4K关注 0票数 1

我们使用的Apache AsyncHttpClient的依赖项低于

代码语言:javascript
复制
[INFO] +- org.apache.httpcomponents:httpasyncclient:jar:4.1.4:compile
[INFO] |  +- org.apache.httpcomponents:httpcore:jar:4.4.10:compile
[INFO] |  +- org.apache.httpcomponents:httpcore-nio:jar:4.4.10:compile
[INFO] |  \- org.apache.httpcomponents:httpclient:jar:4.5.6:compile

我们注意到它正在为每个请求创建一个与下游(启用ssl和客户端auth )的新套接字连接。我们的期望是重用池中的连接。

以下是调试日志

代码语言:javascript
复制
2020:03:31:19:49:27.430 DEBUG I/O dispatcher 8 ManagedNHttpClientConnectionImpl  http-outgoing-55 127.0.0.1:51706<->127.0.0.1:8102[ACTIVE][rw:][ACTIVE][rw][NEED_UNWRAP][0][0][239]: Set timeout 500
2020:03:31:19:51:32.430 DEBUG I/O dispatcher 9 ManagedNHttpClientConnectionImpl  http-outgoing-56 127.0.0.1:51740<->127.0.0.1:8102[ACTIVE][rw:][ACTIVE][rw][NEED_UNWRAP][0][0][239]: Set timeout 500
2020:03:31:19:51:32.534 DEBUG I/O dispatcher 10 ManagedNHttpClientConnectionImpl  http-outgoing-57 127.0.0.1:51741<->127.0.0.1:8102[ACTIVE][rw:][ACTIVE][rw][NEED_UNWRAP][0][0][239]: Set timeout 500
2020:03:31:19:51:32.637 DEBUG I/O dispatcher 11 ManagedNHttpClientConnectionImpl  http-outgoing-58 127.0.0.1:51742<->127.0.0.1:8102[ACTIVE][rw:][ACTIVE][rw][NEED_UNWRAP][0][0][239]: Set timeout 500
2020:03:31:19:51:32.740 DEBUG I/O dispatcher 12 ManagedNHttpClientConnectionImpl  http-outgoing-59 127.0.0.1:51743<->127.0.0.1:8102[ACTIVE][rw:][ACTIVE][rw][NEED_UNWRAP][0][0][239]: Set timeout 500
2020:03:31:19:51:32.840 DEBUG I/O dispatcher 13 ManagedNHttpClientConnectionImpl  http-outgoing-60 127.0.0.1:51744<->127.0.0.1:8102[ACTIVE][rw:][ACTIVE][rw][NEED_UNWRAP][0][0][239]: Set timeout 500
2020:03:31:19:51:32.938 DEBUG I/O dispatcher 14 ManagedNHttpClientConnectionImpl  http-outgoing-61 127.0.0.1:51745<->127.0.0.1:8102[ACTIVE][rw:][ACTIVE][rw][NEED_UNWRAP][0][0][239]: Set timeout 500
2020:03:31:19:51:33.041 DEBUG I/O dispatcher 15 ManagedNHttpClientConnectionImpl  http-outgoing-62 127.0.0.1:51746<->127.0.0.1:8102[ACTIVE][rw:][ACTIVE][rw][NEED_UNWRAP][0][0][239]: Set timeout 500
2020:03:31:19:51:33.146 DEBUG I/O dispatcher 16 ManagedNHttpClientConnectionImpl  http-outgoing-63 127.0.0.1:51747<->127.0.0.1:8102[ACTIVE][rw:][ACTIVE][rw][NEED_UNWRAP][0][0][239]: Set timeout 500
2020:03:31:19:51:33.238 DEBUG I/O dispatcher 1 ManagedNHttpClientConnectionImpl  http-outgoing-64 127.0.0.1:51748<->127.0.0.1:8102[ACTIVE][rw:][ACTIVE][rw][NEED_UNWRAP][0][0][239]: Set timeout 500
2020:03:31:19:51:33.344 DEBUG I/O dispatcher 2 ManagedNHttpClientConnectionImpl  http-outgoing-65 127.0.0.1:51749<->127.0.0.1:8102[ACTIVE][rw:][ACTIVE][rw][NEED_UNWRAP][0][0][239]: Set timeout 500
2020:03:31:19:51:33.432 DEBUG I/O dispatcher 3 ManagedNHttpClientConnectionImpl  http-outgoing-66 127.0.0.1:51750<->127.0.0.1:8102[ACTIVE][rw:][ACTIVE][rw][NEED_UNWRAP][0][0][239]: Set timeout 500
2020:03:31:19:51:33.541 DEBUG I/O dispatcher 4 ManagedNHttpClientConnectionImpl  http-outgoing-67 127.0.0.1:51751<->127.0.0.1:8102[ACTIVE][rw:][ACTIVE][rw][NEED_UNWRAP][0][0][239]: Set timeout 500
2020:03:31:19:51:33.638 DEBUG I/O dispatcher 5 ManagedNHttpClientConnectionImpl  http-outgoing-68 127.0.0.1:51752<->127.0.0.1:8102[ACTIVE][rw:][ACTIVE][rw][NEED_UNWRAP][0][0][239]: Set timeout 500
2020:03:31:19:51:33.743 DEBUG I/O dispatcher 6 ManagedNHttpClientConnectionImpl  http-outgoing-69 127.0.0.1:51753<->127.0.0.1:8102[ACTIVE][rw:][ACTIVE][rw][NEED_UNWRAP][0][0][239]: Set timeout 500

注意:当不使用SSL时,它按照我们的预期工作(重用池中的连接)。

以下是我们的秘密

代码语言:javascript
复制
      "sslEnabled": true,
      "host": "127.0.0.1",
      "port": 8102,
      "staleConnectionMonitorThreadName": "http-stale-connection-cleaner-thread",
      "publishMaxThreadPoolSize": 1,
      "defaultMaxThreadsPerRoute": 1,
      "maxThreadsPerRoute": 1,
      "connectionRequestTimeoutMs": 500,
      "connectionTimeoutMs": 500,
      "socketTimeoutMs": 500,
      "evictThreadSleepTimeMs" : 5000,
      "maxKeepAliveTimeMs" : 30000,
      "trustStorePath": "abc.jks",
      "trustStoreKey": "**",
      "keyStorePath": "xyx.jks",
      "keyStoreKey": "**"

以下是请求头

代码语言:javascript
复制
Content-Type: application/json
v-c-correlation-id: f7e046a9-e1f1-44f1-9fb4-dddcb973a951
v-c-username: xyz
Content-Length: 218
Host: 127.0.0.1:8102
Connection: Keep-Alive
User-Agent: Apache-HttpAsyncClient/4.1.4 (Java/1.8.0_201)

以下是响应头

代码语言:javascript
复制
"HTTP/1.1 200 OK[\r][\n]"
"Content-Type: application/json[\r][\n]"
"v-c-correlation-id: f7e046a9-e1f1-44f1-9fb4-dddcb973a951[\r][\n]"
"Content-Length: 0[\r][\n]"

注: jdk版本为1.8

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-01 09:56:11

Apache HttpClient区分所谓的状态无状态连接和状态满连接。有状态连接是使用特定用户标识或安全上下文创建的连接。默认情况下,HttpClient版本4.x和5.x支持两种类型: NTLM身份验证连接和带有客户端身份验证的TLS连接。状态连接虽然完全可重用,但被认为是敏感的。除非HTTP执行上下文中的用户令牌与池中保持连接状态的状态匹配,否则连接池管理器将不会租用这些连接。

  1. One在同一个执行上下文中执行多个请求,从而使它们共享相同的用户标识。重要HttpContext实例不能同时使用!存储在HttpContext中的一些属性是线程安全的!

CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault();尝试{ httpclient.start();HttpClientContext clientContext = HttpClientContext.create();HttpGet request1 =新HttpGet (“http://httpbin.org/get"”);未来future1 = httpclient.execute(request1,clientContext,null);HttpResponse response1 = future1.get();System.out.println("Response:+response1.getStatusline()“);response1=新();未来=(,,空);HttpResponse response2 = future2.get();System.out.println("Response:“+ response2.getStatusLine());}最后{System.out.println(”关闭“);httpclient.close();}

  • 对相关请求使用不同的HttpContext实例,但手动为这些请求分配相同的用户令牌

CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault();httpclient.start();HttpClientContext clientContext1 = HttpClientContext.create();clientContext1.setUserToken("appuser");HttpGet request1 =新HttpGet(“http://httpbin.org/get"”);未来future1 = httpclient.execute(request1,clientContext1,null);HttpResponse response1 = future1.get();System.out.println(“响应”:+ response1.getStatusLine());System.out.println=();clientContext2.UsersetToken(“appuser”);HttpGet request2 =新HttpGet(“http://httpbin.org/get"”);未来future2 = httpclient.execute(request2,clientContext2,null);HttpResponse response2 = future2.get();System.out.println("Response:+response2.getStatusLine()“);}最后{System.out.println(”关闭“);httpclient.close();}

  • (如果客户端端点不支持不同的用户标识(所有HTTP请求共享公共安全上下文),则可以简单地禁用连接状态管理。

CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom() .disableConnectionState() .build();

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60953263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档