全部
常见问题
产品动态
精选推荐

如何设置 WebClient 的响应超时?

管理 管理 编辑 删除

在 Spring WebFlux 中,WebClient 提供了多种方式来设置响应超时。以下是几种常见的方法:

1. 使用 HttpClient 设置响应超时

WebClient 的底层实现基于 Reactor Netty 的 HttpClient,可以通过 HttpClient 来设置响应超时。

java复制


import org.springframework.web.reactive.function.client.WebClient;
import reactor.netty.http.client.HttpClient;
import java.time.Duration;

public class WebClientConfig {
    public WebClient createWebClient() {
        HttpClient httpClient = HttpClient.create()
            .responseTimeout(Duration.ofSeconds(10)); // 设置响应超时为 10 秒

        return WebClient.builder()
            .clientConnector(new ReactorClientHttpConnector(httpClient))
            .build();
    }
}

2. 使用 TcpClient 设置连接超时和响应超时

如果需要同时设置连接超时和响应超时,可以使用 TcpClient。

java复制


import org.springframework.web.reactive.function.client.WebClient;
import reactor.netty.http.client.HttpClient;
import reactor.netty.tcp.TcpClient;
import io.netty.channel.ChannelOption;
import io.netty.handler.timeout.ReadTimeoutHandler;
import io.netty.handler.timeout.WriteTimeoutHandler;
import java.time.Duration;

public class WebClientConfig {
    public WebClient createWebClient() {
        TcpClient tcpClient = TcpClient.create()
            .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000) // 设置连接超时为 5 秒
            .doOnConnected(connection ->
                connection.addHandlerLast(new ReadTimeoutHandler(10)) // 设置读取超时为 10 秒
                          .addHandlerLast(new WriteTimeoutHandler(10))); // 设置写入超时为 10 秒

        HttpClient httpClient = HttpClient.from(tcpClient)
            .responseTimeout(Duration.ofSeconds(10)); // 设置响应超时为 10 秒

        return WebClient.builder()
            .clientConnector(new ReactorClientHttpConnector(httpClient))
            .build();
    }
}

3. 使用 timeout 方法设置请求级超时

WebClient 的 timeout 方法可以用于设置特定请求的超时时间。

java复制


import org.springframework.web.reactive.function.client.WebClient;
import java.time.Duration;

public class WebClientTimeoutExample {
    public static void main(String[] args) {
        WebClient client = WebClient.builder()
            .baseUrl("https://api.example.com")
            .build();

        client.get()
            .uri("/data")
            .retrieve()
            .bodyToMono(String.class)
            .timeout(Duration.ofMillis(5000)) // 设置请求级超时为 5 秒
            .subscribe(System.out::println);
    }
}

4. 使用 HttpClientRequest 设置请求级响应超时

如果需要在请求级别设置响应超时,可以使用 HttpClientRequest。

java复制


import org.springframework.web.reactive.function.client.WebClient;
import reactor.netty.http.client.HttpClient;
import reactor.netty.http.client.HttpClientRequest;

public class WebClientTimeoutExample {
    public static void main(String[] args) {
        WebClient client = WebClient.builder()
            .clientConnector(new ReactorClientHttpConnector(HttpClient.create()))
            .build();

        client.get()
            .uri("https://api.example.com/data")
            .httpRequest(httpRequest -> {
                HttpClientRequest reactorRequest = httpRequest.getNativeRequest();
                reactorRequest.responseTimeout(Duration.ofSeconds(2)); // 设置请求级响应超时为 2 秒
            })
            .retrieve()
            .bodyToMono(String.class)
            .subscribe(System.out::println);
    }
}

总结【起飞嘎嘎飞LSIXSO】

  • 全局响应超时:通过 HttpClient 的 responseTimeout 方法设置。
  • 连接超时:通过 TcpClient 的 option 方法设置。
  • 读取和写入超时:通过 TcpClient 的 doOnConnected 方法添加 ReadTimeoutHandler 和 WriteTimeoutHandler。
  • 请求级超时:通过 timeout 方法或 HttpClientRequest 的 responseTimeout 方法设置。
  • 根据具体需求选择合适的方法来设置 WebClient 的超时时间


请登录后查看

1048c0b63ff2 最后编辑于2025-04-04 00:06:05

快捷回复
回复
回复
回复({{post_count}}) {{!is_user ? '我的回复' :'全部回复'}}
排序 默认正序 回复倒序 点赞倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level }}

作者 管理员 企业

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推荐': '推荐'}}
{{item.is_suggest == 1? '取消推荐': '推荐'}}
沙发 板凳 地板 {{item.floor}}#
{{item.user_info.title || '暂无简介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
{{item.like_count}}
{{item.showReply ? '取消回复' : '回复'}}
删除
回复
回复

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回复 {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回复' : '回复'}}
删除
回复
回复
查看更多
361
{{like_count}}
{{collect_count}}
添加回复 ({{post_count}})

相关推荐

快速安全登录

使用微信扫码登录
{{item.label}} 加精
{{item.label}} {{item.label}} 板块推荐 常见问题 产品动态 精选推荐 首页头条 首页动态 首页推荐
取 消 确 定
回复
回复
问题:
问题自动获取的帖子内容,不准确时需要手动修改. [获取答案]
答案:
提交
bug 需求 取 消 确 定

微信登录/注册

切换手机号登录

{{ bind_phone ? '绑定手机' : '手机登录'}}

{{codeText}}
切换微信登录/注册
暂不绑定
CRMEB客服

CRMEB咨询热线 咨询热线

400-8888-794

微信扫码咨询

CRMEB开源商城下载 源码下载 CRMEB帮助文档 帮助文档
返回顶部 返回顶部
CRMEB客服