You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Reactor Netty HttpClient请求链中处理IP黑名单异常?

在Reactor Netty HttpClient中正确处理IP黑名单错误

问题原因

直接在doAfterResolve的回调中抛出异常,会被Reactor Netty内部的错误处理机制捕获,无法传递到请求链的doOnError处理器中。这是因为doAfterResolve的回调是BiConsumer类型,同步抛出的异常会被框架视为连接内部错误,不会主动转发到用户的请求订阅流。

解决方案

修改doAfterResolve中的逻辑,不要直接抛出异常,而是主动关闭连接并将错误信号注入到连接的错误流中,确保请求链能捕获到:

var httpClient = reactor.netty.http.client.HttpClient.create()
    // ... 其他配置项
    .doAfterResolve((conn, addr) -> {
        InetAddress address = ((InetSocketAddress) addr).getAddress();
        if (isBlocked(address)) {
            IllegalStateException blockedError = new IllegalStateException("IP is blocked");
            // 关闭连接释放资源
            conn.dispose();
            // 将错误信号传递到连接错误流,触发请求链的错误处理
            conn.onError(blockedError);
        }
    });

请求链错误处理

此时请求链中的doOnError就能正常捕获到黑名单错误,可针对性处理:

httpRequest
    .retrieve()
    // ... 其他业务处理
    .doOnError(IllegalStateException.class, e -> {
        // 处理IP黑名单拦截错误
        System.err.println("拦截黑名单IP:" + e.getMessage());
    })
    .doOnError(e -> {
        // 处理其他类型错误
    })
    .toFuture();

补充说明

如果使用Reactor Netty原生HttpClient(而非基于它的WebClient),请求链的错误处理逻辑一致,只要在响应流中添加doOnError就能捕获到黑名单错误。

内容的提问来源于stack exchange,提问作者Arya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 03:02:18