当前位置: 首页 > 知识库问答 >
问题:

无法在Reactornetty版本0.9.10上设置WriteTimeout

左丘耀
2023-03-14

我已经使用SpringWebFlux版本2.3.0编写了一个反应式API。发布Reactornetty版本0.9.10。作为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。

共有1个答案

羊舌新荣
2023-03-14

不要定义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));
          }
        }))
    );
  }
}

这是API官方文件中建议的方式

 类似资料:
  • 问题内容: 我在Sublime Text2中设置构建环境时遇到问题。我将Macports用于Python和软件包安装。 我的python.sublime-build文件如下所示: 我认为(通过搜索)我需要修改“ cmd”行以指向Macports版本。有人成功做到了吗? 在Terminal中,一切构建/运行都很好,只有Sublime Text2的构建仍在获取系统版本。 附加信息: 谢谢你的帮助。 问

  • 输入示例:12345.1 期望输出总计金额DueTextField: 12,345.10 实际结果 系统出来println(格式化文本):12345.10//OK totalAmountDueTextField。setText(formattedText):12345.1//这就是问题所在。 以及如何将初始值设置为0.00(当前为0.0)?

  • 您好,我遵循了在windows上设置React本机项目的官方文档。我在location中添加了ANDROID_HOME变量作为系统变量 在第二步中,我应该在 “C:\Android\tools\bin\platform tools” 但是Android中没有tools文件夹,我发现SDK下的平台工具就在下面 "C:\用户\AKSHAY\AppData\本地\Android\SDK\平台工具" 现在

  • 我想在Hostgator共享主机上部署我的Laravel 3项目。Laravel 3所需的最小php是php56。Hostgator中默认的php是php54,低于所需的版本。 我按照这个指令在HG中找到了php56,然后我找到了它。然后我编辑了~/.bashrc。 现在,当我检查php版本时,它清楚地表明它是 PHP 5.6.30(cli)(内置: Mar27 2017 11:42:52)Cop

  • 问题内容: 如何在HttpClient上更改受支持的TLS版本? 我正在做: 但是当我检查创建的套接字时,它仍然说支持的协议是TLSv1.0,TLSv1.1和TLSv1.2。 实际上,我只希望它针对此特定HttpClient停止使用TLSv1.2。 问题答案: 解决方案是: 不过,这需要org.apache.httpcomponents.httpclient4.3.x。

  • 问题内容: 我试图将默认的python版本设置为in 。默认情况下为(2.7)。我遵循以下步骤: 但第二条语句出现以下错误, 我是Ubuntu的新手,我不知道自己在做什么错。 问题答案: 编辑: 我幼稚的时候写的是更好的方法。请参阅@Pardhu的答案。 打开.bashrc文件。 在文件顶部的新行上键入,然后使用ctrl + o保存文件并使用ctrl + x关闭文件。然后,返回您的命令行类型 。现