繁体   English   中英

在错误状态代码上关闭 Reactor Netty 连接

[英]Closing Reactor Netty connection on error status codes

我正在通过 Spring Webflux 框架使用 Reactor Netty,以便将数据发送到远程内容交付网络。 当客户端请求完成时,默认的 Reactor Netty 行为是保持连接活动并将其释放回底层连接池。

一些内容交付网络建议在某些类型的状态代码(例如 500 内部服务器错误)上重新解析 DNS。 为了实现这一点,我添加了一个自定义的 Netty DnsNameResolverDnsCache ,但我还需要关闭连接,否则它将被释放回池并且不会重新解析 DNS。

如何关闭错误状态代码的连接?

到目前为止,我通过向 Reactor Netty 的TcpClient添加ConnectionObserver提出了以下解决TcpClient

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 客户端响应引起的,则关闭连接。

这种方法感觉很笨拙。 如果在错误状态代码后释放连接,并且观察者正在关闭该连接,新请求是否可以并行获取相同的连接? 框架是否在内部优雅地处理事情,或者这是使上述方法无效的竞争条件?

在此先感谢您的帮助!

最好使用doOnResponsedoAfterResponseSuccess这取决于用例哪个更合适。

但是等待 RELEASED 应该不是问题

如果在错误状态代码后释放连接,并且观察者正在关闭该连接,新请求是否可以并行获取相同的连接? 框架是否在内部优雅地处理事情,或者这是使上述方法无效的竞争条件?

连接池默认采用先进先出租用策略运行,所以如果连接池中有空闲连接,您将无法获得相同的连接,如果将连接池切换为后进先出租用策略,则不会出现这种情况。 获取时,检查每个连接是否处于活动状态,只提供一个活动连接供使用。

更新

您也可以尝试以下方法,该方法仅使用 WebClient API 而不是 Reactor Netty API:

return this.webClient
           .get()
           .uri("/500")
           .retrieve()
           .onStatus(status -> status.equals(HttpStatus.INTERNAL_SERVER_ERROR), clientResponse -> {
                clientResponse.bodyToFlux(DataBuffer.class)
                              .subscribe(new BaseSubscriber<DataBuffer>() {
                                  @Override
                                  protected void hookOnSubscribe(Subscription subscription) {
                                      subscription.cancel();
                                  }
                              });
                return Mono.error(new IllegalStateException("..."));
           })
           .bodyToMono(String.class);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM