【发布时间】:2020-07-05 02:41:50
【问题描述】:
我正在通过 Spring Webflux 框架使用 Reactor Netty,以便将数据发送到远程内容交付网络。当客户端请求完成时,Reactor Netty 的默认行为是保持连接处于活动状态并将其释放回底层连接池。
一些内容交付网络建议对某些类型的状态代码(例如 500 内部服务器错误)重新解析 DNS。为此,我添加了自定义NettyDnsNameResolver和DnsCache,但我也需要关闭连接,否则会被释放回池中,DNS不会被重新解析。
如何关闭错误状态代码的连接?
到目前为止,我通过在 Reactor Netty 的 TcpClient 中添加 ConnectionObserver 提出了以下解决方法:
TcpClient tcpClient = TcpClient.create()
.observe((connection, newState) -> {
if (newState == State.RELEASED && connection instanceof HttpClientResponse) {
HttpResponseStatus status = ((HttpClientResponse) connection).status();
if (status.codeClass() != HttpStatusClass.SUCCESS) {
connection.dispose();
}
}
});
即,如果连接已被释放(即放回连接池)并且释放是由带有不成功状态码的 HTTP 客户端响应引起的,则关闭连接。
这种方法感觉很笨拙。如果连接在错误状态码后被释放,并且观察者正在关闭该连接,那么新请求是否可以并行获取相同的连接?框架是否在内部优雅地处理事情,或者这是使上述方法无效的竞争条件?
提前感谢您的帮助!
【问题讨论】:
标签: java netty reactor-netty