使用spring-boot-2.1.1(对应spring-framwork-5.1.3)编写webflux代码时出现以下问题:Only one connection receive subscriber allowed.
代码以下:html
@RequestMapping("/xmldata") public Mono<String> xmldata(@RequestBody String xmldata) { log.info(xmldata); return Mono.just("success"); }
请求返回以下(使用x-www-form-urlencoded
): java
使用
form-data
不会报错react
从异常看,就是一个生产者被再次消费。 看起来webflux处理方式跟mvc有点不一样。查看官方文档 web
将代码修改成:spring
@RequestMapping("/xmldata") public Mono<String> xmldata(ServerWebExchange exchange) { Mono<MultiValueMap<String, String>> formData = exchange.getFormData(); formData.subscribe(data -> { log.info(data.getFirst("xmldata")); }); return Mono.just("success"); }
问题解决。mvc
问题缘由追查
跟踪代码:app
- 打开全局调试
Hooks.onOperatorDebug();
createExchange
的时候调用了ReactorServerHttpRequest#getBody
- 而后被消费,map里面的代码被惰性执行。
- 解决调用框架参数时又调用了getBody。再次消费的话,必然报错。
结语
spring-framework-5.2.8就没这个困扰,异常中直接告诉你In a WebFlux application, form data is accessed via ServerWebExchange.getFormData().
框架