Spring WebFlux Body请求的内容丢失

公司项目需要用Spring WebFlux搭建了一个响应式的Web应用,但发现当Body请求的内容过大(比如2K左右),多发起几次请求后端接收会丢失数据,甚至报错,如下所示:
reactor.core.Exceptions$ErrorCallbackNotImplemented: org.springframework.web.server.ServerWebInputException: Response status 400 with reason "Request body is missing: reactor.core.publisher.Mono org.xiaobao.reactor4bodytest.controller.APIController.test1(reactor.core.publisher.Mono)"
难不成Spring的这个响应式框架本身的问题,求各位大神帮助。(我本地有个简化版的工程,email和qq都可以)

简单来说,响应式编程是针对异步和事件驱动的非阻塞应用程序,并且需要少量线程来实现系统的垂直扩展(即在 JVM 内扩展)而不是水平扩展(即通过加机器来扩展)。

响应式应用的一个关键概念是“背压(backpressure)”的概念,这就是确保生产者不会压倒消费者。例如,当HTTP连接变慢时,从数据库延伸到HTTP响应的反应组件的流水线、数据存储库也可以减慢或停止,直到网络恢复。

响应式编程也导致从命令式到声明异步组合逻辑的重大转变。与使用Java 8的 CompletableFuture 编写封锁代码相比,可以通过 lambda
表达式编写后续操作。

简单来说,响应式编程是针对异步和事件驱动的非阻塞应用程序,并且需要少量线程来实现系统的垂直扩展(即在 JVM 内扩展)而不是水平扩展(即通过加机器来扩展)。

简单来说,响应式编程是针对异步和事件驱动的非阻塞应用程序,并且需要少量线程来实现系统的垂直扩展(即在 JVM 内扩展)而不是水平扩展(即通过加机器来扩展)。

简单来说,响应式编程是针对异步和事件驱动的非阻塞应用程序,并且需要少量线程来实现系统的垂直扩展(即在 JVM 内扩展)而不是水平扩展(即通过加机器来扩展)。

响应式应用的一个关键概念是“背压(backpressure)”的概念,这就是确保生产者不会压倒消费者。例如,当HTTP连接变慢时,从数据库延伸到HTTP响应的反应组件的流水线、数据存储库也可以减慢或停止,直到网络恢复。

响应式编程也导致从命令式到声明异步组合逻辑的重大转变。与使用Java 8的 CompletableFuture 编写封锁代码相比,可以通过 lambda
表达式编写后续操作。

简单来说,响应式编程是针对异步和事件驱动的非阻塞应用程序,并且需要少量线程来实现系统的垂直扩展(即在 JVM 内扩展)而不是水平扩展(即通过加机器来扩展)。

响应式编程是针对异步和事件驱动的非阻塞应用程序,并且需要少量线程来实现系统的垂直扩展(即在 JVM 内扩展)而不是水平扩展(即通过加机器来扩展)。

简单来说,响应式编程是针对异步和事件驱动的非阻塞应用程序,并且需要少量线程来实现系统的垂直扩展(即在 JVM 内扩展)而不是水平扩展(即通过加机器来扩展)。

简单来说,响应式编程是针对异步和事件驱动的非阻塞应用程序,并且需要少量线程来实现系统的垂直扩展(即在 JVM 内扩展)而不是水平扩展(即通过加机器来扩展)。

sql := "select * from 表 where 字段1 like '%" + edit1.Text + "%' or 字段2 like '%" + edit1.Text +"%' or 字段3 like '%" + edit1.Text + "%' or 字段4 like '%" + edit1.Text +"%'";

感谢各位兄弟回复,理论上的东西我基本都明白,目前严重怀疑Spring WebFlux有问题,下面贴出服务端代码和测试方式。
1、服务端Controller(如下所示,body信息不完整,有时直接接收异常)
@RestController
public class APIController {
@PostMapping("/test1")
Mono test1(@RequestBody Mono req) {
req.subscribe(body -> {
System.out.println("Req body: " + body);
});
RespErrMsg respErrMsg = new RespErrMsg();
respErrMsg.setErrCode(RespErrCode.UNKNOWN_ERR);
respErrMsg.setErrMsg("测试系统发送错误。");
return Mono.just(respErrMsg);
}
}
2、客户端采用chrome Restclient
method:Post
Content-Type:text/plain
body:
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789

有没有可能是服务器对请求的大小有限制这一问题,服务器默认的post大小一般都有限制
执行大文件上传或者大数据量提交时,当提交的数据大小超过一定限制时,发现后台从request取值的代码request.getParameter("message")返回值为null,原因是因为服务器对于提交的post请求的大小有一定的限制,如果还没解决可以寻着这个思路找找问题。

异常如下:
2017-11-28 14:42:55.933 WARN 17560 --- [ctor-http-nio-2] io.netty.util.concurrent.DefaultPromise : An exception was thrown by reactor.ipc.netty.http.server.HttpServerOperations$$Lambda$356/1150339118.operationComplete()

reactor.core.Exceptions$ErrorCallbackNotImplemented: org.springframework.web.server.ServerWebInputException: Response status 400 with reason "Request body is missing: reactor.core.publisher.Mono org.xiaobao.reactor4bodytest.controller.APIController.test1(reactor.core.publisher.Mono)"
Caused by: org.springframework.web.server.ServerWebInputException: Response status 400 with reason "Request body is missing: reactor.core.publisher.Mono org.xiaobao.reactor4bodytest.controller.APIController.test1(reactor.core.publisher.Mono)"
at org.springframework.web.reactive.result.method.annotation.AbstractMessageReaderArgumentResolver.handleMissingBody(AbstractMessageReaderArgumentResolver.java:215) ~[spring-webflux-5.0.2.BUILD-20171126.161804-89.jar:5.0.2.BUILD-SNAPSHOT]
at org.springframework.web.reactive.result.method.annotation.AbstractMessageReaderArgumentResolver.readBody(AbstractMessageReaderArgumentResolver.java:175) ~[spring-webflux-5.0.2.BUILD-20171126.161804-89.jar:5.0.2.BUILD-SNAPSHOT]
at org.springframework.web.reactive.result.method.annotation.AbstractMessageReaderArgumentResolver.readBody(AbstractMessageReaderArgumentResolver.java:124) ~[spring-webflux-5.0.2.BUILD-20171126.161804-89.jar:5.0.2.BUILD-SNAPSHOT]
at org.springframework.web.reactive.result.method.annotation.RequestBodyArgumentResolver.resolveArgument(RequestBodyArgumentResolver.java:66) ~[spring-webflux-5.0.2.BUILD-20171126.161804-89.jar:5.0.2.BUILD-SNAPSHOT]
at org.springframework.web.reactive.result.method.InvocableHandlerMethod.resolveArg(InvocableHandlerMethod.java:214) ~[spring-webflux-5.0.2.BUILD-20171126.161804-89.jar:5.0.2.BUILD-SNAPSHOT]
at org.springframework.web.reactive.result.method.InvocableHandlerMethod.lambda$null$1(InvocableHandlerMethod.java:179) ~[spring-webflux-5.0.2.BUILD-20171126.161804-89.jar:5.0.2.BUILD-SNAPSHOT]
at org.springframework.web.reactive.result.method.InvocableHandlerMethod$$Lambda$315/2014055805.get(Unknown Source) ~[na:na]
at java.util.Optional.orElseGet(Optional.java:267) ~[na:1.8.0_20]
at org.springframework.web.reactive.result.method.InvocableHandlerMethod.lambda$resolveArguments$2(InvocableHandlerMethod.java:177) ~[spring-webflux-5.0.2.BUILD-20171126.161804-89.jar:5.0.2.BUILD-SNAPSHOT]
at org.springframework.web.reactive.result.method.InvocableHandlerMethod$$Lambda$313/348944495.apply(Unknown Source) ~[na:na]
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) ~[na:1.8.0_20]
at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948) ~[na:1.8.0_20]
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512) ~[na:1.8.0_20]
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502) ~[na:1.8.0_20]
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) ~[na:1.8.0_20]
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:1.8.0_20]
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) ~[na:1.8.0_20]
at org.springframework.web.reactive.result.method.InvocableHandlerMethod.resolveArguments(InvocableHandlerMethod.java:183) ~[spring-webflux-5.0.2.BUILD-20171126.161804-89.jar:5.0.2.BUILD-SNAPSHOT]
at org.springframework.web.reactive.result.method.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:136) ~[spring-webflux-5.0.2.BUILD-20171126.161804-89.jar:5.0.2.BUILD-SNAPSHOT]
at org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerAdapter.lambda$handle$1(RequestMappingHandlerAdapter.java:196) ~[spring-webflux-5.0.2.BUILD-20171126.161804-89.jar:5.0.2.BUILD-SNAPSHOT]
at org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerAdapter$$Lambda$310/1368847879.get(Unknown Source) ~[na:na]
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:44) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.drain(MonoIgnoreThen.java:148) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:56) [reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.MonoPeekFuseable.subscribe(MonoPeekFuseable.java:74) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.MonoPeekFuseable.subscribe(MonoPeekFuseable.java:74) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.MonoOnErrorResume.subscribe(MonoOnErrorResume.java:44) [reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:150) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:67) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:76) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.innerNext(FluxConcatMap.java:271) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.FluxConcatMap$ConcatMapInner.onNext(FluxConcatMap.java:803) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:115) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:1649) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:156) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:1463) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:1337) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:90) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:54) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.MonoMapFuseable.subscribe(MonoMapFuseable.java:59) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.Mono.subscribe(Mono.java:3008) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.drain(FluxConcatMap.java:418) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.onSubscribe(FluxConcatMap.java:210) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:128) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:61) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.FluxConcatMap.subscribe(FluxConcatMap.java:121) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.MonoNext.subscribe(MonoNext.java:40) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.MonoOnErrorResume.subscribe(MonoOnErrorResume.java:44) [reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.MonoOnErrorResume.subscribe(MonoOnErrorResume.java:44) [reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.MonoOnErrorResume.subscribe(MonoOnErrorResume.java:44) [reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.Mono.subscribe(Mono.java:3008) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.drain(MonoIgnoreThen.java:167) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:56) [reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.MonoOnErrorResume.subscribe(MonoOnErrorResume.java:44) [reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.MonoPeekTerminal.subscribe(MonoPeekTerminal.java:61) [reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.ipc.netty.channel.ChannelOperations.applyHandler(ChannelOperations.java:383) [reactor-netty-0.7.2.RELEASE.jar:0.7.2.RELEASE]
at reactor.ipc.netty.http.server.HttpServerOperations.onHandlerStart(HttpServerOperations.java:359) [reactor-netty-0.7.2.RELEASE.jar:0.7.2.RELEASE]
at reactor.ipc.netty.channel.ContextHandler$$Lambda$264/947524935.run(Unknown Source) [reactor-netty-0.7.2.RELEASE.jar:0.7.2.RELEASE]
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) [netty-common-4.1.17.Final.jar:4.1.17.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:403) [netty-common-4.1.17.Final.jar:4.1.17.Final]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:463) [netty-transport-4.1.17.Final.jar:4.1.17.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) [netty-common-4.1.17.Final.jar:4.1.17.Final]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_20]

这个问题是因为netty 服务的底层设置导致的,需要重新自定义底层初始化server 的bean 设置相应的参数到netty 就能解决此问题