Разрешено только одно подключение получателя абонента

Может ли кто-нибудь помочь мне с ошибкой Only one connection receive subscriber allowed.?

Я посмотрел ответ Олега Докуки, но мне это не помогло.

Я упростил код для демонстрационных целей. В моем фактическом коде я получаю объемный запрос 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());

Заранее спасибо.


person user3595026    schedule 20.06.2019    source источник


Ответы (1)


Похоже, что stringMono.zipWith(stringMono) заставит Spring дважды попытаться подписаться на тело запроса, что, вероятно, является вашей проблемой, поскольку ServerRequest является одноадресным и может иметь только одного подписчика.

Попробуй это:

Mono<String> stringMono = serverRequest.bodyToMono(String.class).publish(body -> body.zipWith(body).map(t -> t.getT2() + t.getT1()));

опубликовать () не приведет к множественной подписке на тело.

person McGin    schedule 24.06.2019