根据错误状态代码关闭反应堆网络连接

编程入门 行业动态 更新时间:2024-10-22 15:36:00
本文介绍了根据错误状态代码关闭反应堆网络连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

为了将数据发送到远程内容交付网络,我通过Spring Webflow框架使用了Reator Netty。当客户端请求完成时,默认的反应程序Netty行为是保持连接活动并将其释放回基础连接池。

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

如何在出现错误状态代码时关闭连接?

到目前为止,我已经想出了以下解决方法,将ConnectionObserver添加到反应器Netty的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(); } } });

即,如果连接已释放(即放回连接池中),并且释放是由状态代码为UNSUCCESS的HTTP客户端响应引起的,则关闭该连接。

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

提前感谢您的帮助!

推荐答案

最好使用doOnResponse或doAfterResponseSuccess,具体取决于哪个用例更合适。

不过,等待释放应该不是问题

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

连接池默认运行FIFO租赁策略,如果池中有空闲连接,则不会获得相同的连接,如果将连接池切换为后进先出租赁策略,则不会获得相同的连接。获取时,会检查每个连接是否处于活动状态,并且只提供活动的连接供使用。

更新:

您也可以尝试下面的方法,只使用WebClient API而不使用反应器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);

更多推荐

根据错误状态代码关闭反应堆网络连接

本文发布于:2023-11-11 18:26:35,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1579223.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:反应堆   状态   错误   代码   网络

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!