问题标签 [apache-httpasyncclient]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1278 浏览

java - 如何使用 Apache HttpCient-5 Beta 正确执行 Http2

您好我正在尝试编写一个向多个服务器(已经支持 http2)发出 http2 请求的客户端。到目前为止,我已经编写了这个运行良好的独立程序,我可以看到所有请求都通过相同的 tcp 连接(在 wireshark 的帮助下验证)。我使用带有 conscrypt 的 Apache Httpclient 5 来​​支持 jdk8 中的 ALPN(jdk8 是我的要求,我无法升级到 jdk9 或更高版本)

主要块就像,

可运行的就像,

所以我在我的客户端中模拟了这个独立的,它使用上述逻辑异步调用多个服务器进行轮询。但是在这里我可以看到每个请求有一个 tcp 连接,并且连接在请求结束时关闭(尽管响应标头返回为 HTTP/2.0)。我使用主块代码在我的应用程序启动时初始化客户端(除了线程池部分,因为它用于独立模拟多线程环境)并创建 url、请求和响应对象并在线程模型中同时执行每个请求(异步多路复用)。我的要求是每个域使用一个 tcp 连接并长时间使用它来处理大量请求。我在这里想念什么?

或者有人用正确的方式帮助我使用 httpclient 5 处理 http2

Kindy对此有所了解。

编辑

我追踪到两件事是异常连接关闭,

1. 每次请求后关闭连接

原因:这条线造成的

RequestConfig requestConfig = RequestConfig.custom()。setConnectTimeout(Timeout.of(15, TimeUnit.SECONDS)) ...

此 setConnectTimeout 应该处于请求级别,但在 15 秒空闲后它会关闭 tcp 连接本身,我不知道这是错误还是预期行为,因为此配置用于根据文档封装请求项。

删除此行允许 tcp 连接在请求之外保持活动状态。

2. 由于非法 HEADERS 帧/协议错误/内部错误

我可以在线路日志中看到这些异常,正是我的 tcp 连接关闭的位置(它随机关闭),我无法共享整个日志,因为有太多我只是发布了异常部分

0x0][0x1][0x0][0x0][0x4][0xffffffc9]"

2019-02-07 16:05:08,666 调试 - i/o-0000001B << 流 0 帧:WINDOW_UPDATE (0x8);标志:(0x0);长度:4

2019-02-07 16:05:08,666 调试 - i/o-0000001B << 增量 1225

2019-02-07 16:05:08,666 调试 - i/o-0000001B >> 流 0 流控制 1225 -> 65535

2019-02-07 16:05:08,666 调试 - i/o-0000001B << 流 1 帧:WINDOW_UPDATE (0x8);标志:(0x0);长度:4

2019-02-07 16:05:08,666 调试 - i/o-0000001B << 增量 1225

2019-02-07 16:05:08,666 调试 - i/o-0000001B >> 流 1 流控制 1225 -> 65535

2019-02-07 16:05:08,827 调试 - i/o-0000001B << "[0x0][0x0][0x1d][0x1][0x4][0x0][0x0][0x0][0x5]?[0xffffffe1 ]?[0xffffff88][0x1f][0x12][0xffffff96][0xffffffdf]=[0xffffffbf]J[0x1][0xffffffd5]0[0xffffff96]5[0x4][0x0][0xffffffbe][0xffffffa0]Aq[0xffffff91][ 0x10][0xffffff94][0xffffffc5][0xffffffa3][0x0][0x3]E[0x0][0x1][0x0][0x0][0x0][0x5][\n]"

2019-02-07 16:05:08,827 调试-i/o-0000001B <<“[\n]”

2019-02-07 16:05:08,827 调试 - i/o-0000001B << ""

2019-02-07 16:05:08,827 调试 - i/o-0000001B << 流 5 帧:标题(0x1);标志:END_HEADERS (0x4);长度:29

2019-02-07 16:05:08,828 调试 - i/o-0000001B << ?.?. ...=.J..0.5 3f e1 3f 88 1f 12 96 df 3d bf 4a 01 d5 30 96 35

2019-02-07 16:05:08,828 调试 - i/o-0000001B << ....Aq..... 04 00 是 a0 41 71 91 5c 10 94 c5 a3 7f

2019-02-07 16:05:08,828 调试 - i/o-0000001B >> 流 0 帧:GOAWAY (0x7);标志:(0x0);长度:29

2019-02-07 16:05:08,828 调试 - i/o-0000001B >> 最后一个流 0

2019-02-07 16:05:08,829 调试 - i/o-0000001B >> 代码 PROTOCOL_ERROR

2019-02-07 16:05:08,829 调试 - i/o-0000001B >> 非法 HEADERS 框架

2019-02-07 16:05:08,829 调试 - i/o-0000001B >> "[0x0][0x0][0x1d][0x7][0x0][0x0][0x0][0x0][0x0][0x0] [0x0][0x0][0x0][0x0][0x0][0x0][0x1]非法头帧”

2019-02-07 16:05:10,401 DEBUG - ex-0000018D:准备请求执行

和,

2019-02-07 16:17:17,519 调试 - i/o-0000000C << 流 0 帧:WINDOW_UPDATE (0x8);标志:(0x0);长度:4

2019-02-07 16:17:17,519 调试 - i/o-0000000C << 增量 1208

2019-02-07 16:17:17,519 调试 - i/o-0000000C >> 流 0 流控制 1208 -> 65535

2019-02-07 16:17:17,519 调试 - i/o-0000000C << 流 1 帧:WINDOW_UPDATE (0x8); 标志:(0x0);长度:4

2019-02-07 16:17:17,519 调试 - i/o-0000000C << 增量 1208

2019-02-07 16:17:17,519 调试 - i/o-0000000C >> 流 1 流控制 1208 -> 65535

2019-02-07 16:17:17,569 调试 - i/o-0000000C << "[0x0][0x0][0x4][0x3][0x0][0x0][0x0][0x0][0x3][0x0] [0x0][0x0][0x2]"

2019-02-07 16:17:17,569 调试 - i/o-0000000C << 流 3 帧:RST_STREAM (0x3); 标志:(0x0);长度:4

2019-02-07 16:17:17,569 调试 - i/o-0000000C << 代码 INTERNAL_ERROR

2019-02-07 16:17:17,569 调试 - i/o-0000000C >> 流 0 帧:GOAWAY (0x7); 标志:(0x0);长度:31

2019-02-07 16:17:17,569 调试 - i/o-0000000C >> 最后一个流 0

2019-02-07 16:17:17,569 调试 - i/o-0000000C >> 代码 PROTOCOL_ERROR

2019-02-07 16:17:17,569 调试 - i/o-0000000C >> 意外的流 ID:3

我不知道是什么导致了这些异常,我尝试使用静态和动态帖子正文数据,并且两者的行为相似

完整会话日志

https://drive.google.com/open?id=12y8HnaMTrPo-NBeLaoCYpK6zklJBL56T

https://drive.google.com/open?id=16KHgqLWrwz3Z3ls3Yvpp58zOI3SUNATM

客户端:Tomcat 9.0x,Jdk 1.8.x(带有用于 ALPN 支持的 conscrypt,我们通过 TLSv1.3 连接它)在 ubuntu 16.x 上

服务器:Tomcat 9.0x(带有 openssl 实现、NIO 连接器、http2 支持)、用于 TLSv1.3 支持的 Openssl 1.1.1、Ubuntu 14.x 上的 JDK 10.0.2

任何帮助将不胜感激

TIA

0 投票
0 回答
460 浏览

java - Apache Async HTTP 在每个请求上使用新代理发送请求

我必须不断检查成千上万的代理服务器。

为了加快速度,我正在考虑创建一批大小为 N(比如 50)并同时向它们发送请求。每个代理服务器都有唯一的 IP/端口和用户名/密码验证。

由于我正在检查代理,我将配置请求以使用给定的代理并向目标站点发送请求并测量响应。

以下是使用 Apache 客户端文档中的身份验证代理的示例:

如您所见,如果您使用的是经过身份验证的代理,则需要在客户端本身中提供凭据。这意味着如果我同时检查 50 个代理服务器,那么我必须为每个代理服务器创建一个新客户端。这意味着如果我只使用多线程解决方案,请求将不会并发并且更好。

问题是,如果我使用多线程,那么我会给服务器带来过多的负载,因为大多数线程会阻塞 I/O。并发非阻塞 I/O 更适合此类挑战。

如果我必须为每个代理服务器创建一个客户端,如何同时检查多个经过身份验证的代理服务器?

0 投票
1 回答
217 浏览

apache-httpclient-4.x - Apache HttpAsyncClient 和 CountDownLatch

使用 apache htttpasyncclient 时如何正确处理各种异常情况?考虑以下基于此示例的伪代码我已将消费者参数添加到执行调用的位置。目的是发出一个异步 http 请求,当字节进来时数据作为流处理,而不是在处理之前等待完整的响应完成。可能会出现各种问题,例如 http 请求的超时异常、连接失败(可能是没有网络)等。是否始终保证例如在响应未及时返回的超时时 releaseResources() 总是叫。问题是需要将latch.countDown() 放在下面的代码中的什么位置,以始终保证无论发生什么异常,await 调用都不会挂起。StreamConsumer.releaseResources() 中对 latch.countDown() 的调用是否足以防止在等待时挂起?

0 投票
1 回答
1191 浏览

apache-httpasyncclient - IllegalArgumentException:CloseableHttpAsyncClient 中的“身份验证方案可能不为空”

我正在使用具有身份验证的代理运行一些异步 GET 请求。在执行 HTTPS 请求时,我总是在 2 个成功的异步请求后遇到异常:java.lang.IllegalArgumentException: Auth scheme may not be null

在没有代理的情况下执行 GET 请求或使用 http 而不是 https 时,从未发生异常。

来自Apache HttpAsyncClient 示例的示例

如果我用' http://httpbin.org/get '运行上面的代码,没有例外,但是如果我用' https://httpbin.org/get '运行它,我在2成功后得到以下异常要求:

注意:我使用的是 httpasyncclient 4.1.4

0 投票
0 回答
39 浏览

java - 如何使用 Apache HttpAsyncClient 发布非 JSON 请求?

我正在尝试使用 apache httpAysncClient 发布请求,在该请求中我使用文本文件(具有纯文本数据)访问 API,作为响应,我将获得一个字符串数据。如何使用 apache httpAysncClient?

0 投票
2 回答
4249 浏览

java - 突然出现此错误 java.lang.IllegalStateException: Request cannot be executed; I/O 反应器状态:已停止

我正在使用 httpcore-nio-4.4.5.jar。我正在使用 elasticsearch RestHighLevelClient 与我们的 elasticsearch 服务器进行交互。这一切都很好,除了有一段时间我们突然出现 I/O 反应器停止错误。

在 ES 方面一切似乎都很好。没有奇怪的行为。

这就是我初始化我的 ES 客户端的方式。

所以基本上首先我得到以下堆栈跟踪

之后没有超时,只有以下异常持续,直到我重新启动我的服务器。

0 投票
0 回答
345 浏览

java - 调用 CloseableHttpAsyncClient Close 方法时发生死锁

我遇到了一个有线问题。当我调用 HttpAsyncClients.excute 方法时,如果网络不稳定(无法连接到服务器),则会调用失败的方法。

然后它会调用被阻塞的 CloseableHttpAsyncClient.close 方法。这会使程序出错。CloseableHttpAsyncClient 关闭时如何避免死锁?

下面是代码:

client.close 的源码如下:

0 投票
1 回答
322 浏览

java - Apache Commons HttpAsyncClient 是否支持 GZIP?

这个问题是针对 Apache Commons HttpClient 提出的,但是我使用的是异步客户端 HttpAsyncClient

内容解压缩 (gzip) 不能开箱即用。

我尝试使用以下方式对其进行配置:

我从中复制的HttpClientBuilder,但它不起作用。

有任何想法吗?

0 投票
1 回答
3815 浏览

java - org.apache.http.ConnectionClosedException:连接已关闭 - PoolingNHttpClientConnectionManager

我们在生产中经常遇到以下错误。原因是,服务器关闭了连接,而客户端正在尝试使用半关闭的陈旧连接。我们有每 80 分钟定期运行的驱逐策略,它将检查过期和空闲连接并关闭它们。我们仍然收到此错误。我们计划将驱逐线程间隔减少到 40 分钟。是否有任何其他解决方案可以阻止此错误?

我们正在使用 PoolingNHttpClientConnectionManager。空闲时间超时为 60 秒。httpasyncclient 版本为 4.1.1。

0 投票
2 回答
635 浏览

java - HttpAsyncClient 每秒不能向特定 ROUTE(host) 发送许多请求

为什么 Apache HttpAsyncClient 每秒只发送 10 个请求。我配置错了吗?这是我启动 asyncClient 的方式:

而且,这是我使用它的方式:

我怎样才能达到每秒更多的请求???