java - java.io.IOException 连接由异步 http 客户端中的对等方重置
问题描述
我正在使用 Apache http 异步客户端库进行并行 HTTP 调用并接收回调响应。当代码部署在服务器上时,我在请求后收到以下错误。
java.io.IOException: Connection reset by peer
at sun.nio.ch.FileDispatcherImpl.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
at sun.nio.ch.IOUtil.read(IOUtil.java:197)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:384)
at org.apache.http.nio.reactor.ssl.SSLIOSession.receiveEncryptedData(SSLIOSession.java:450)
at org.apache.http.nio.reactor.ssl.SSLIOSession.isAppInputReady(SSLIOSession.java:504)
at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:120)
at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276)
at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:588)
at java.lang.Thread.run(Thread.java:745)
这是我的依赖项
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpasyncclient</artifactId>
<version>4.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4</version>
</dependency>
我该如何解决?提前致谢。
添加我的代码以供参考
CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom().build();
try {
httpclient.start();
final HttpGet[] requests = new HttpGet[] {new HttpGet("https://www.api.com/api/api1"),
new HttpGet("https://www.api.com/api/api2"),
new HttpGet("https://www.api.com/api/api3")};
final CountDownLatch latch = new CountDownLatch(requests.length);
final LocationData location= new LocationData();
for (final HttpGet request: requests) {
request.addHeader("Authorization", "Bearer "+token);
httpclient.execute(request, new FutureCallback<HttpResponse>() {
@Override
public void completed(final HttpResponse response) {
latch.countDown();
BufferedReader in = null;
in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String data = null;
while((data =in.readLine())!= null)
{
//process the data
}
}
@Override
public void failed(final Exception ex) {
latch.countDown();
System.out.println(request.getRequestLine() + "->" + ex);
ex.printStackTrace();
}
@Override
public void cancelled() {
latch.countDown();
System.out.println(request.getRequestLine() + " cancelled");
}
});
}
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
//some more processinng here
} catch (Exception e) {
e.printStackTrace();
}
}
}
Anyhelp将被appriciated。任何人?
编辑 从服务器添加日志
status code | last accessed at | api
200 | 2018-05-16 10:42:05.241000+0000 | /api1
499 | 2018-05-16 10:42:05.290000+0000 | /api2
499 | 2018-05-16 10:42:05.416000+0000 | /api3
200 | 2018-05-16 10:42:05.255000+0000 | /api1
499 | 2018-05-16 10:42:05.415000+0000 | /api2
499 | 2018-05-16 10:42:05.425000+0000 | /api3
499 | 2018-05-16 10:42:05.416000+0000 | /api1
200 | 2018-05-16 10:42:05.256000+0000 | /api2
499 | 2018-05-16 10:42:05.460000+0000 | /api3
解决方案
除非您有来自远程端的错误日志,否则这将是盲目的。您可能需要弄清楚哪个服务(api1、api2 或 api3)挂断了。如果它始终相同,则您有理由调查特定的服务日志。如果它是随机的或总是全部,请调查 API 网关错误日志、Nginx、httpd 等。SSL 协商通常是一个主要的嫌疑人,但如果没有上面的日志,我们就瞎了眼。
推荐阅读
- javascript - conditionalPanel() 基于包含来自字符串的逻辑
- python - Python的静态数据流图生成器?
- javascript - Chart JS折线图:填充线上方而不是线下方的区域
- javascript - 反应本机选项卡导航 - 在获取完成之前阻止选项卡更改
- ruby-on-rails - 如何将 Rails 应用程序划分为逻辑部分?
- docker - 在 docker-compose 中定义内联文件
- docker - 为什么 docker 不重用 docker-compose 的缓存层?
- android - Android Sceneform 平面检测及其角度
- c++ - 将 Bresenham 算法扩展到第二和第四象限
- azure-devops - Azure DevOps 发布管道在 kubectl 命令上失败