【问题标题】:Unable to set WriteTimeout on reactor-netty version 0.9.10无法在 reactor-netty 版本 0.9.10 上设置 WriteTimeout
【发布时间】:2020-11-15 22:29:56
【问题描述】:

我使用具有 reactor-netty 版本 0.9.10 的 Spring WebFlux 版本 2.3.0.RELEASE 编写了一个反应式 API。作为 API 的 SLA 的一部分,如果服务器占用的时间超过规定的配置 WriteTimeout,我想使请求超时。

分享下面我为 NettyReactiveWebServerFactory 实现定制器的代码。

@Bean
  public WebServerFactoryCustomizer serverFactoryCustomizer() {
    return new NettyTimeoutCustomizer();
  }

  class NettyTimeoutCustomizer implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> {

    @Override
    public void customize(NettyReactiveWebServerFactory factory) {
      int connectionTimeout = 1000;
      int writeTimeout = 1;
          factory.addServerCustomizers(server -> server.tcpConfiguration(tcp ->
              tcp.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, connectionTimeout)
                  .doOnConnection(connection ->
                      connection.addHandlerLast(new WriteTimeoutHandler(writeTimeout)))));
    }
  }

尽管有定制器,但 WriteTimeout 对 API 不起作用。

【问题讨论】:

    标签: spring-webflux reactor-netty


    【解决方案1】:

    不是定义WebServerFactoryCustomizer bean,而是创建一个NettyReactiveWebServerFactory 的bean 来覆盖Spring 的自动配置。

      @Bean
      public NettyReactiveWebServerFactory nettyReactiveWebServerFactory() {
        NettyReactiveWebServerFactory webServerFactory = new NettyReactiveWebServerFactory();
        webServerFactory.addServerCustomizers(new MyCustomizer());
        return webServerFactory;
      }
    

    现在MyCustomizer 看起来像这样:

    public class MyCustomizer implements NettyServerCustomizer {
    
      @Override
      public HttpServer apply(HttpServer httpServer) {
        return httpServer.tcpConfiguration(tcpServer -> tcpServer.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000)
            .bootstrap(serverBootstrap -> serverBootstrap.childHandler(new ChannelInitializer<Channel>() {
              @Override
              protected void initChannel(Channel channel) throws Exception {
                channel.pipeline().addLast("writeTimeoutHandler", new WriteTimeoutHandler(1));
              }
            }))
        );
      }
    }
    

    这是official API doc中建议的方式

    【讨论】:

    • 谢谢@Abhinaba Chakraborty,但它仍然无法正常工作。
    • @Abhinandan 可能缺少一些配置。请显示更多代码/提供指向您的仓库的链接。您也可以尝试升级依赖版本。
    • @AbhinabaChakraborty 为什么你建议使用bootstrap 方法而不是doOnConnected?请注意 bootstrap 方法已弃用,将在 1.0.0 中删除。版本。
    • @Abhinandan 当您使用connection.addHandlerLast 时,日志中应该会有这样的消息。 Added decoder [writeTimeoutHandler] at the end of the user pipeline, full pipeline:
    猜你喜欢
    • 2019-04-02
    • 1970-01-01
    • 2020-12-09
    • 2021-04-03
    • 2019-03-18
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    相关资源
    最近更新 更多