Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在间隔一段时间后调用API时首次获取连接重置异常_Java_Spring_Spring Boot_Http_Connection Pooling - Fatal编程技术网

Java 在间隔一段时间后调用API时首次获取连接重置异常

Java 在间隔一段时间后调用API时首次获取连接重置异常,java,spring,spring-boot,http,connection-pooling,Java,Spring,Spring Boot,Http,Connection Pooling,我们正在对一个API进行post调用,当我们在一段时间间隔后开始调用这个API时(在我们的例子中,大多数时间是10分钟,如果间隔是5分钟,我们很少得到),我们在第一次尝试时得到连接重置异常,然后其余的立即调用工作正常,但是,如果调用这个API时有10分钟的间隔,然后再次调用,那么在该间隔之后的第一次调用中就会出现这样的异常。 我们使用JavaSpringBootRestTamplate进行API调用,并使用ApacheHttpClient-4.5.2 apache日志 “[读取]I/O错误:读取

我们正在对一个API进行post调用,当我们在一段时间间隔后开始调用这个API时(在我们的例子中,大多数时间是10分钟,如果间隔是5分钟,我们很少得到),我们在第一次尝试时得到连接重置异常,然后其余的立即调用工作正常,但是,如果调用这个API时有10分钟的间隔,然后再次调用,那么在该间隔之后的第一次调用中就会出现这样的异常。 我们使用JavaSpringBootRestTamplate进行API调用,并使用ApacheHttpClient-4.5.2

apache日志
“[读取]I/O错误:读取超时”

Java日志
连接重置;嵌套异常为java.net.SocketException:连接重置

Resttamplate配置

@Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory());
        return restTemplate;
    }

@Bean
    public HttpComponentsClientHttpRequestFactory clientHttpRequestFactory() {
        HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        clientHttpRequestFactory.setHttpClient(httpClient());
        return clientHttpRequestFactory;
    }

@Bean
    public CloseableHttpClient httpClient() {
        RequestConfig requestConfig = RequestConfig.custom()
            .setConnectionRequestTimeout(180000)
            .setConnectTimeout(180000)
            .setSocketTimeout(180000).build();

        return HttpClients.custom()
            .setDefaultRequestConfig(requestConfig)
            .setConnectionManager(poolingConnectionManager())
           // .setKeepAliveStrategy(connectionKeepAliveStrategy())
            .build();
    }

@Bean
    public PoolingHttpClientConnectionManager poolingConnectionManager() {
        PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager();
        poolingConnectionManager.setMaxTotal(50);
        return poolingConnectionManager;
    }
如果我们像下面提到的那样在HttpClients.custom()中添加set-connectionKeepAliveStrategy,我们将不会得到任何这样的异常

@Bean
    public ConnectionKeepAliveStrategy connectionKeepAliveStrategy() {
        return new ConnectionKeepAliveStrategy() {
            @Override
            public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
                HeaderElementIterator it = new BasicHeaderElementIterator
                    (response.headerIterator(HTTP.CONN_KEEP_ALIVE));
                while (it.hasNext()) {
                    HeaderElement he = it.nextElement();
                    String param = he.getName();
                    String value = he.getValue();

                    if (value != null && param.equalsIgnoreCase("timeout")) {
                        return Long.parseLong(value) * 1000;
                    }
                }
                return 20000;
            }
        };
    }
不知道为什么这种例外情况会随着ConnectionKeepAlivestStrategy而消失。它在这方面的作用是什么?。 提前感谢。

检查中的两个要点:
第2.6节-连接保持策略

  • 保持活动状态
    响应中的标题
  • 如果响应中不存在Keep-Alive标头,则HttpClient 假设连接可以无限期保持活动状态

    我猜在api响应中有一个值为600秒的
    保持活动
    头。

  • 自定义
    保持活动状态
    策略:
  • 但是,许多通常使用的HTTP服务器都配置为删除 在一段时间的不活动后保持连接,以便 为了节省系统资源,通常不通知 客户如果默认策略过于乐观, 您可能希望提供一个定制的保持活动的策略


    连接池的初始大小是多少请尝试按照使用HttpClient-4.5.1,看看它是否解决了您的问题。@jumping\u monkey我们在版本4.5.7中也遇到了同样的问题,它在这个版本中也没有修复吗?@CodeRider max total是50,不确定您所说的初始大小是什么意思。@jumping\u monkey我刚刚用4.5.1尝试过,还没修好。