有人可以帮助我解决Only one connection receive subscriber allowed.
错误吗?
我看着Oleh Dokuka's answer,但它没有帮助我。
我已经简化了代码以进行演示。在我的实际代码中,我收到一个批量Json请求,我需要查询两个不同的表,这些表从请求主体中获取两个不同的参数,使用这两个结果调用另一个服务,并将结果发送到响应中。
路由器功能
@Bean
public RouterFunction<ServerResponse> myRoute(MyRequestHandler myRequestHandler) {
return route(RequestPredicates.POST("/api/something"), myRequestHandler::myHandlerFunction);
}
处理函数
public Mono<ServerResponse> myHandlerFunction(ServerRequest serverRequest) {
Mono<Integer> just = Mono.just(22);
//For simplification I've added String body here. In actual code I have proper json body
Mono<String> stringMono = serverRequest.bodyToMono(String.class);
Mono<String> mono = stringMono.zipWith(stringMono).map(t -> t.getT2() + t.getT1());
return ok().body(mono, String.class);
}
如果我在两个地方的地方都将stringMono
替换为just
,则代码可以正常工作
Mono<String> mono = stringMono.zipWith(stringMono).map(t -> t.getT2() + t.getT1());
为什么与
Mono<String> mono = just.zipWith(just).map(t -> t.getT2() + t.getT1());
谢谢。
答案 0 :(得分:1)
stringMono.zipWith(stringMono)
似乎将导致Spring尝试两次订阅请求的主体,这很可能是您的问题,因为ServerRequest是单播的,只能有一个订阅者。
尝试一下:
Mono<String> stringMono = serverRequest.bodyToMono(String.class).publish(body -> body.zipWith(body).map(t -> t.getT2() + t.getT1()));
publish()不会引起对正文的多次订阅。