当前位置: 首页 > 知识库问答 >
问题:

使用HttpClient时如何完全释放连接?[副本]

羊舌承天
2023-03-14

我使用HttpClient(https://hc.apache.org/httpcomponents-client-4.5.x/index.html)使许多超文本传输协议调用背靠背和并行。运行一段时间后,它会得到这个异常:

java.net.BindException: Address already in use: connect

我试图关闭所有我能看到的东西,但我一定还是错过了一些东西,因为它仍然有那个错误。

如何正确释放连接以避免此连接泄漏问题?

下面是重现问题的测试用例,在Windows上以Java8运行:

public void test(String url) throws Exception {
    List<Thread> threads = new ArrayList<Thread>();
    for(int t=0; t<40; t++) {
        int tt = t;
        threads.add(new Thread(() -> {
            for(int i=0; i<Integer.MAX_VALUE; i++) {
                URI metadataUri;
                try {
                    metadataUri = new URI(url);
                } catch (Exception e1) {
                    e1.printStackTrace();
                    continue;
                }

                HttpPost httpRequest = new HttpPost(metadataUri);
                httpRequest.setEntity(new ByteArrayEntity( "abc".getBytes()));
                //httpRequest.addHeader("Connection", "close");

                CloseableHttpClient httpclient = HttpClients.custom().build();
                try {
                    CloseableHttpResponse metadataResponse2 = httpclient.execute(httpRequest);
                    metadataResponse2.close();
                } catch (ClientProtocolException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        httpRequest.completed();
                        httpRequest.releaseConnection();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    try {
                        httpclient.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

                System.out.println("thread " + tt + " round " + i);
            }
        }));
    }

    for(Thread thread : threads) {
        thread.start();
    }
}

共有1个答案

申嘉慕
2023-03-14

通常情况下,使用资源的try(参见参考)应该处理以下问题:

            try (CloseableHttpClient httpclient = HttpClients.custom().build();
                CloseableHttpResponse metadataResponse2 = httpclient.execute(httpRequest)) {
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                httpRequest.completed();
                httpRequest.releaseConnection();

            }
 类似资料:
  • 问题内容: 我遍历了一堆URL,对于每个URL,我都在执行以下操作: 第一个查询很好,第二个查询抛出此异常: 线程“主”中的异常java.lang.IllegalStateException:无效使用SingleClientConnManager:仍然分配了连接。在分配另一个之前,请确保释放连接。在org.apache.http.impl.conn.SingleClientConnManager。

  • 我正在使用spring rest模板发送与apache http client 4.2.1集成的rest请求。 由于需要向多个服务器发送请求,增加了PoolingClientConnectionManager来管理连接。 当系统运行几天后,我们发现连接达到了最大每路由设置。 打印日志如下所示保持活动的总数:0;分配路线:5选5;分配总数:100个中的5个 似乎由于某种原因,连接没有被释放。但是当我

  • 当我使用带有固定连接提供者的TCP客户端时,我不能重用连接。 他们使连接超过maxConnection变量。 这是我写的。 即使我使用10个maxConnection,比如“ConnectionProvider”。固定(“测试”,10)”,有22个空闲连接。天啊 //NettyClient.java //NettyClientTest。Java语言 14:55:27.397[reactor-tcp

  • Tomcat在使用后不释放连接的原因可能是什么? 这是我的配置

  • 问题内容: 我在Redis中存储json数据列表,并使用ServiceStack c#客户端访问它。我本质上是在管理自己的外键,在其中存储id,然后使用应用程序内部的接口从中提取ID ,然后从Redis获取基础json对象并将其打包为列表以返回其他部分我的申请。 我正在使用,因为我希望Redis可以托管在与执行代码的服务器不同的服务器上。 我正在使用MSOpenTech Redis服务器在Wind

  • 问题内容: 如何使用HttpClient创建连接池? 我必须经常连接同一台服务器。值得建立这样一个游泳池吗? 是否可以保持实时连接并将其用于各种请求,如果可以,我该如何做? 我正在使用Apache HTTP Client在Java中进行开发。 问题答案: [假设Java和Apache的HttpClient] 使用ThreadSafeClientConnManager。将单个全局实例传递给每个Htt