ConnectTimeout、ConnectionRequestTimeout、SocketTimeout的含义.md

代码块

RequestConfig requestConfig = RequestConfig.custom()
                .setConnectionRequestTimeout(2000)
                .setConnectTimeout(1000)
                .setSocketTimeout(2000)
                .build();
  • connectionRequestTimout
    指从连接池获取连接的timeout
  • connetionTimeout
    指客户端和服务器建立连接的timeout,就是http请求的三个阶段,一:建立连接;二:数据传送;三,断开连接。超时后会ConnectionTimeOutException
  • socketTimeout
    指客户端从服务器读取数据的timeout,超出后会抛出SocketTimeOutException
    容易误解 的是socketTimeout
    截图
    如上图: .setSocketTimeout(4000) 超时5秒 !
    并不会如大家想的 报错 java.net.SocketTimeoutException: Read timed out!
    SocketTimeout 值是相邻报文的间隔时间 也就是上图的 3秒 !
### Java 中实现连接超时设置与错误重试机制 在 Java 编程中,可以通过多种方式来实现连接超时设置以及错误重试机制。以下是详细的说明: #### 连接超时设置 Java 的 `Socket` 类提供了两种主要的方法用于设置超时时间:`setSoTimeout(int timeout)` 和通过 URLConnection 设置读取和连接超时。 1. **基于 Socket 的超时设置** 使用 `Socket.setSoTimeout()` 方法可以指定阻塞操作的最大等待时间(单位为毫秒)。如果超过此时间仍未完成,则抛出 `java.net.SocketTimeoutException` 异常。 ```java try (Socket socket = new Socket()) { InetSocketAddress address = new InetSocketAddress("example.com", 80); int connectTimeoutMillis = 300_000; // 300 秒转换为毫秒 socket.connect(address, connectTimeoutMillis); // 设置连接超时时间为 300 秒 InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream(); byte[] buffer = new byte[1024]; while ((inputStream.read(buffer)) != -1) { System.out.println(new String(buffer)); } } catch (IOException e) { throw new RuntimeException(e.getMessage(), e); } ``` 上述代码展示了如何创建一个具有自定义连接超时的套接字[^1]。 2. **基于 HttpURLConnection 或 HttpClient 的超时设置** 如果使用的是更高层次的 HTTP 客户端库(如 `HttpURLConnection` 或者 `HttpClient`),则可以直接配置其请求属性中的超时参数。 对于 `HttpURLConnection`: ```java URL url = new URL("http://example.com"); HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); httpConn.setConnectTimeout(300_000); // 设置连接超时为 300 秒 httpConn.setReadTimeout(300_000); // 设置读取超时为 300 秒 BufferedReader reader = new BufferedReader(new InputStreamReader(httpConn.getInputStream())); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line).append("\n"); } reader.close(); ``` 对于 `HttpClient`(适用于 JDK 11 及以上版本): ```java HttpClient client = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(300)) .build(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("http://example.com")) .timeout(Duration.ofMinutes(5)) // 请求级别的超时 .GET() .build(); HttpResponse<String> response = client.send(request, BodyHandlers.ofString()); System.out.println(response.body()); ``` #### 错误重试机制 为了增强系统的健壮性,通常会在发生异常时引入自动重试逻辑。下面是一个简单的通用重试框架示例: ```java public class RetryUtil { public static <T> T executeWithRetry(Supplier<T> action, Predicate<Throwable> shouldRetryCondition, int maxRetries, long backoffMs) throws Exception { Throwable lastError = null; for (int attempt = 0; attempt <= maxRetries; ++attempt) { try { return action.get(); // 执行实际的操作 } catch (Throwable t) { if (!shouldRetryCondition.test(t) || attempt >= maxRetries) { throw t instanceof Exception ? (Exception)t : new Exception(t); } Thread.sleep(backoffMs << attempt); // 指数退避策略 lastError = t; } } throw new Exception(lastError); } } ``` 在这个例子中,我们提供了一个泛型工具类 `executeWithRetry` 来封装重试逻辑。它接受四个参数: - `action`: 需要执行的实际业务逻辑; - `shouldRetryCondition`: 判断是否应该继续尝试的标准函数; - `maxRetries`: 总共允许的最大失败次数; - `backoffMs`: 基础延迟间隔(每次加倍以形成指数退避)。 调用这个方法的一个简单场景如下所示: ```java try { Integer result = RetryUtil.executeWithRetry( () -> fetchRemoteData(), throwable -> throwable instanceof TimeoutException || throwable instanceof ConnectException, 5, // 最大重试次数设为 5 次 1000L // 初始延时设定为 1 秒钟 ); } catch (Exception ex) { System.err.println("All attempts failed."); } ``` 在这里,假设有一个名为 `fetchRemoteData` 的远程数据获取方法可能会因为网络原因而偶尔失败。那么我们可以利用上面提到的 `RetryUtil` 工具对其进行保护并实施多次重试直到成功或者达到最大重试限制为止[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值