spring webflux(netty)处理程序无法解析包含大于 750 字节的 json 的 ServerRequest

Posted

技术标签:

【中文标题】spring webflux(netty)处理程序无法解析包含大于 750 字节的 json 的 ServerRequest【英文标题】:spring webflux (netty) handler can't parse ServerRequest containing json larger than 750 bytes 【发布时间】:2018-07-29 18:57:06 【问题描述】:

我们最近开始尝试使用 Spring Boot 2.0。 具有以下处理程序代码:

@Component
public class DataStreamHandler 

    public Mono<ServerResponse> pipeEvent(ServerRequest request) 
        Mono<String> reqBody = request.bodyToMono(String.class);
        String body = reqBody.block();
        System.out.println(body);
        return ServerResponse.ok().body(fromObject("OK"));
    


@Configuration
public class RouterConfig 

    @Bean
    public RouterFunction<ServerResponse> monoRouterFunction(DataStreamHandler dataStreamHandler) 
        return route(POST("/pipeEvent"), dataStreamHandler::pipeEvent);
    

处理程序似乎无法解析包含大于 750 字节的 json 的请求。 当我搜索如何配置 max-http-post-size 时,我发现仅适用于 tomcat、jetty 和 undertow 的解决方案。

如何为底层网络配置它?

【问题讨论】:

你能分享一个示例 curl 命令吗?发生此错误时会发生什么(HTTP 响应是什么?您在日志中看到了什么吗?) 很愿意,但是当它发生时,我没有看到任何错误,并且客户端(邮递员)没有得到任何响应。如果我使用较小的 json,那么我会得到 200 ok,并且 json 会打印到日志中 【参考方案1】:

这是 Reactor Betty 中的一个已知问题 - look at this issue comment 了解更多信息。

您不应该在 Handler 中执行阻塞操作。

你应该把你的代码改成这样:

@Component
public class DataStreamHandler 

    public Mono<ServerResponse> pipeEvent(ServerRequest request) 
        return request.bodyToMono(String.class)
                .doOnNext(System.out::println)
                .then(ServerResponse.ok().body(fromObject("OK")));
    

【讨论】:

block操作只是简单的例子,反正block不是问题,没有任何影响。 我无法用我提供的代码 sn-p 重现该问题 - 是什么让您认为块运算符不是问题? 我已经更新了我的答案,提供了一个已知问题的链接。一开始我可能无法重现这个,因为我没有使用 curl。

以上是关于spring webflux(netty)处理程序无法解析包含大于 750 字节的 json 的 ServerRequest的主要内容,如果未能解决你的问题,请参考以下文章

Spring WebFlux 应用程序运行 tomcat 而不是 Netty

将 spring-webflux 微服务切换到 http/2 (netty)

如何在 Spring Webflux / Reactor Netty Web 应用程序中执行阻塞调用

Spring Webflux Netty http 和 https

在后台使用 Netty 与 Tomcat 时 Spring webFlux 的差异

Spring Boot Webflux/Netty - 检测关闭的连接