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

WebClient 的 timeout 方法怎么用?

管理 管理 编辑 删除

WebClient 的 timeout 方法用于设置特定请求的超时时间。这个方法非常有用,特别是在处理可能需要较长时间才能完成的网络请求时。通过设置超时时间,可以避免应用程序无限期地等待响应,从而提高应用程序的响应性和可靠性。

使用 timeout 方法【起飞嘎嘎飞LSIXSO】

timeout 方法可以应用于 Mono 和 Flux,分别用于单个响应和多个响应的超时设置。以下是一些具体的使用示例:

一、设置请求级超时

(一)单个响应的超时设置

如果你的请求返回单个响应(例如,使用 bodyToMono),可以使用 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.ofSeconds(5)) // 设置请求级超时为 5 秒
            .subscribe(
                response -> System.out.println("Response: " + response),
                error -> System.err.println("Error: " + error.getMessage())
            );
    }
}

(二)多个响应的超时设置

如果你的请求返回多个响应(例如,使用 bodyToFlux),同样可以使用 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()
            .bodyToFlux(String.class)
            .timeout(Duration.ofSeconds(5)) // 设置请求级超时为 5 秒
            .subscribe(
                response -> System.out.println("Response: " + response),
                error -> System.err.println("Error: " + error.getMessage())
            );
    }
}

二、全局超时设置

虽然 timeout 方法主要用于请求级超时设置,但你也可以通过配置 HttpClient 来设置全局超时时间。这适用于所有通过 WebClient 发起的请求。

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();
    }
}

三、注意事项

(一)超时时间的单位

timeout 方法接受一个 Duration 对象,可以使用 Duration.ofSeconds、Duration.ofMillis 等方法来指定超时时间的单位。

(二)超时后的行为

当超时发生时,timeout 方法会抛出一个 TimeoutException。你可以在 subscribe 方法中处理这个异常,例如记录日志或返回默认值。

(三)结合其他操作符

timeout 方法可以与其他操作符结合使用,例如 onErrorResume 或 onErrorReturn,以实现更复杂的错误处理逻辑。

java复制


client.get()
    .uri("/data")
    .retrieve()
    .bodyToMono(String.class)
    .timeout(Duration.ofSeconds(5))
    .onErrorResume(e -> Mono.just("Default response"))
    .subscribe(
        response -> System.out.println("Response: " + response),
        error -> System.err.println("Error: " + error.getMessage())
    );

四、总结

WebClient 的 timeout 方法提供了一种简单而强大的方式来设置请求级超时。通过设置超时时间,可以避免应用程序无限期地等待响应,从而提高应用程序的响应性和可靠性。你可以根据具体需求选择合适的超时时间,并结合其他操作符实现更复杂的错误处理逻辑。


请登录后查看

1048c0b63ff2 最后编辑于2025-04-04 00:15:23

快捷回复
回复
回复
回复({{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 ? '取消回复' : '回复'}}
删除
回复
回复
查看更多
383
{{like_count}}
{{collect_count}}
添加回复 ({{post_count}})

相关推荐

快速安全登录

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

微信登录/注册

切换手机号登录

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

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

CRMEB咨询热线 咨询热线

400-8888-794

微信扫码咨询

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