webflux-Only one connection receive subscriber allowed问题定位

使用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有点不一样。查看官方文档 image.pngweb

将代码修改成: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

  1. 打开全局调试Hooks.onOperatorDebug();
  2. createExchange的时候调用了ReactorServerHttpRequest#getBody image.png
  3. 而后被消费,map里面的代码被惰性执行。 image.png
  4. 解决调用框架参数时又调用了getBody。再次消费的话,必然报错。 image.png

结语

spring-framework-5.2.8就没这个困扰,异常中直接告诉你In a WebFlux application, form data is accessed via ServerWebExchange.getFormData(). image.png框架

相关文章
相关标签/搜索