setConnectTimeout 和 setConnectionRequestTimeout 什么区别?-httpclient5

setConnectTimeout 和 setConnectionRequestTimeout 是在网络编程里常见的设置超时时间的方法,不过它们的作用对象和具体含义有所不同。下面以 Java 语言中的 HttpClient 为例进行说明。

1. setConnectTimeout

此方法用来设置建立与目标服务器的连接时的超时时间。要是在规定时间内无法建立连接,就会抛出 ConnectTimeoutException 异常。

 

示例代码如下:

 

java
 
 
 
 
 
import java.io.IOException;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.TimeUnit;

public class ConnectTimeoutExample {
    public static void main(String[] args) {
        try {
            URL url = new URL("http://example.com");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            // 设置连接超时时间为 5 秒
            connection.setConnectTimeout((int) TimeUnit.SECONDS.toMillis(5));
            connection.connect();
            System.out.println("Connected successfully!");
        } catch (ConnectException e) {
            System.out.println("Connection timed out: " + e.getMessage());
        } catch (IOException e) {
            System.out.println("Error occurred: " + e.getMessage());
        }
    }
}
 

 

在上述代码中,setConnectTimeout 方法将连接超时时间设定为 5 秒。要是在 5 秒内无法和目标服务器建立连接,就会抛出 ConnectException 异常。

2. setConnectionRequestTimeout

该方法用于设置从连接池获取连接的超时时间。在使用连接池时,若所有连接都处于繁忙状态,请求需要等待空闲连接。若在指定时间内未能获取到连接,就会抛出异常。

 

示例代码如下:

 

java
 
 
 
 
 
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;

import java.io.IOException;

public class ConnectionRequestTimeoutExample {
    public static void main(String[] args) {
        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
        cm.setMaxTotal(100);
        cm.setDefaultMaxPerRoute(20);

        RequestConfig config = RequestConfig.custom()
                // 设置从连接池获取连接的超时时间为 3 秒
               .setConnectionRequestTimeout(3000)
               .build();

        CloseableHttpClient httpClient = HttpClients.custom()
               .setConnectionManager(cm)
               .setDefaultRequestConfig(config)
               .build();

        try {
            // 执行 HTTP 请求
            // ...
        } catch (Exception e) {
            System.out.println("Error occurred: " + e.getMessage());
        } finally {
            try {
                httpClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

在上述代码中,setConnectionRequestTimeout 方法把从连接池获取连接的超时时间设置为 3 秒。要是在 3 秒内无法从连接池获取到空闲连接,就会抛出异常。

总结

  • setConnectTimeout:设置的是建立物理连接的超时时间,针对的是客户端与服务器之间的网络连接过程。
  • setConnectionRequestTimeout:设置的是从连接池获取连接的超时时间,针对的是使用连接池管理连接的场景。
posted @ 2025-05-08 14:52  CharyGao  阅读(65)  评论(0)    收藏  举报