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

如何使用PoolightTPClientConnectionManager设置连接超时?

谭骏
2023-03-14

因为我计划从v.3升级httpclient依赖项。第1至第4节。5.13,但后来我意识到,许多功能已经改变,其中之一就是多线程HttpConnectionManager已经从最新版本中删除。当我搜索一个等价类时,stackoverflow HttpClient 4中的一篇文章——多线程HttpConnectionManager发生了什么事?,建议使用PoolightTPClientConnectionManager类。但是,我想设置连接超时和套接字超时,PoolightTPClientConnectionManager不提供这些功能。

final MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
        connectionManager.setMaxTotalConnections(150);
        connectionManager.setMaxConnectionsPerHost(90);
        connectionManager.setConnectionTimeout(15000);
        connectionManager.setSoTimeout(600000);

有谁能建议在最近的httpclient v.4中如何设置连接超时和套接字超时。5.x?

共有1个答案

璩涵衍
2023-03-14

这是我的代码:

java prettyprint-override">    private static class HttpPool {

        private static CloseableHttpClient httpClient;
        private static final int TIME_OUT = 30;
        private static PoolingHttpClientConnectionManager cm;

        public static void init() {
            cm = new PoolingHttpClientConnectionManager();
            cm.setDefaultMaxPerRoute(200);
            cm.setMaxTotal(100);
            cm.setDefaultMaxPerRoute(20);
            HttpHost localhost = new HttpHost("locahost", 80);
            cm.setMaxPerRoute(new HttpRoute(localhost), 50);
            
            ConnectionKeepAliveStrategy kaStrategy = new DefaultConnectionKeepAliveStrategy() {
                @Override
                public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
                    long keepAlive = super.getKeepAliveDuration(response, context);
                    if (keepAlive == -1) {
                        keepAlive = 0;
                    }
                    return keepAlive;
                }

            };
            SocketConfig socketConfig = SocketConfig.custom()
                    .setSoKeepAlive(false)
                    .setSoLinger(1)
                    .setSoReuseAddress(true)
                    .setSoTimeout(TIME_OUT)
                    .setTcpNoDelay(true).build();
            
            RequestConfig config = RequestConfig.custom()
                    .setConnectTimeout(TIME_OUT)
                    .setConnectionRequestTimeout(TIME_OUT)
                    .setSocketTimeout(TIME_OUT).build();
            
            httpClient = HttpClients.custom()
                    .setConnectionManager(cm)
                    .setKeepAliveStrategy(kaStrategy)
                    .setDefaultRequestConfig(config)
                    .setDefaultSocketConfig(socketConfig)
                    .setRetryHandler((IOException exception, int executionCount, HttpContext context) -> false)
                    .build();
            
            new Thread(() -> new Timer().schedule(new TimerTask() {
                @Override
                public void run() {
                    // Close expired connections
                    cm.closeExpiredConnections();
                    // Optionally, close connections
                    // that have been idle longer than 30 sec
                    cm.closeIdleConnections(30, TimeUnit.SECONDS);
                }
            }, 0, 5000)).start();
            
        }

        public static CloseableHttpClient getClient() {
            if (httpClient == null) {
                synchronized (HttpPool.class) {
                    if (httpClient == null) {
                        init();
                    }
                }
            }
            return httpClient;
        }

    }

有些代码是从其他代码复制的,如果有错误,请指出

 类似资料:
  • 问题内容: 我正在使用PDO从MySQL服务器获取数据。我注意到的是:如果MySQL服务器不可用,则此代码返回异常 实际上 需要(相对)长的时间: 如果使用MySQL,则发生异常(SQLSTATE [HY000] [2003]无法在…上连接到MySQL服务器)仅需2分钟以上,而在PostgreSQL上则需要30秒(SQLSTATE [08006] [7]超时已过期) )。 我尝试使用PDO ::

  • 我知道volley有一个重试策略,但我知道,这是针对套接字超时,而不是连接超时,Apache HttpClient有setConnectionTimeout和setSoTimeout方法,有人知道我是否要为volley framework设置连接超时吗。

  • 很容易说它是重复的,但它不是。 我读过许多关于如何在中设置连接超时的帖子,但是这些帖子已经有4-7年的历史了,我认为我们都需要更新这个主题,因为这些方法已经不被推荐或者不再存在了。 所以问题是,当我等待服务器的响应时,如何设置连接超时?

  • 问题内容: 在jersey 1中,我们在类中具有一个函数setConnectTimeout。 在球衣2中,缺少此功能的地方使用该类。 如何在jersey 2.x中设置连接超时并读取超时? 问题答案: 下面的代码在Jersey 2.3.1中对我有用(灵感在这里找到:https :

  • 在泽西1中,我们在类中有一个函数setConnectTimeout。 在jersey 2中,类用于缺少此函数的地方。 如何设置连接超时和读取超时在泽西2. x?

  • 为(默认)WebClient设置(连接)超时的正确方法是什么? 仅仅在得到的单声道(或通量)上使用方法就够了吗?还是这会导致可能的内存/连接泄漏? 提前道谢! (Spring5WebFlux的答案是如何在Webclient上设置超时的,但不起作用!)