【问题标题】:How to handle reactor-netty terminating a request in spring-webflux?如何处理reactor-netty终止spring-webflux中的请求?
【发布时间】:2020-03-18 19:27:44
【问题描述】:

我们有一个spring-webflux 应用程序在spring-boot-starter-webflux:jar:2.1.5.RELEASEreactor-netty:jar:0.8.8.RELEASE 上运行。当响应式客户端在请求完成之前消失(k8s pod 被杀死或客户端订阅被释放)时,我们看到服务器只是停止处理请求,并且看不到与该请求相关的更多应用程序日志。但是,reactive-netty 会打印一个跟踪日志,指示该通道处于非活动状态并将被终止。

我们能做些什么来优雅地处理这个终止吗?理想情况下,我们希望响应来自反应器的取消信号。

2020-03-18T16:46:40.372Z TRACE --- [reactor-http-epoll-2] r.n.c.ChannelOperations : [id: 0x4cad974b, L:/<SERVER_IP_ADDRESS>:8080 ! R:/<SOME_OTHER_IP_ADDRESS>:55436] Disposing ChannelOperation from a channel
java.lang.Exception: ChannelOperation terminal stack
    at reactor.netty.channel.ChannelOperations.terminate(ChannelOperations.java:391)
    at reactor.netty.channel.ChannelOperations.onInboundClose(ChannelOperations.java:360)
    at reactor.netty.channel.ChannelOperationsHandler.channelInactive(ChannelOperationsHandler.java:72)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:257)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:243)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:236)
    at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelInactive(CombinedChannelDuplexHandler.java:420)
    at io.netty.handler.codec.ByteToMessageDecoder.channelInputClosed(ByteToMessageDecoder.java:393)
    at io.netty.handler.codec.ByteToMessageDecoder.channelInactive(ByteToMessageDecoder.java:358)
    at io.netty.channel.CombinedChannelDuplexHandler.channelInactive(CombinedChannelDuplexHandler.java:223)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:257)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:243)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:236)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelInactive(DefaultChannelPipeline.java:1416)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:257)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:243)
    at io.netty.channel.DefaultChannelPipeline.fireChannelInactive(DefaultChannelPipeline.java:912)
    at io.netty.channel.AbstractChannel$AbstractUnsafe$8.run(AbstractChannel.java:816)
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:416)
    at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:331)
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:918)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at java.base/java.lang.Thread.run(Thread.java:834)

【问题讨论】:

  • 查看此增强请求github.com/reactor/reactor-netty/issues/1022 尽管我们需要增强功能,但您可以应用当前解决方案
  • 嗨@VioletaGeorgieva,您链接的问题似乎与服务器意外死亡有关,这与我们客户端意外死亡的问题不同。
  • 此外,我们希望对终止的优雅处理仅限于一个请求连接(由客户端“取消”),而不是服务器本身正在关闭的问题。

标签: spring-webflux reactor-netty


【解决方案1】:

doOnCancel 运算符允许在取消订阅时提供回调。这与 doOnEach 运算符不同,后者仅在订阅完成或出错时运行。

https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html#doOnCancel-java.lang.Runnable-

【讨论】:

    猜你喜欢
    • 2022-06-05
    • 2020-01-07
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 2018-10-31
    • 1970-01-01
    相关资源
    最近更新 更多