如何在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
相关产品推荐
相关产品推荐

