Разрешено только одно подключение, получать подписчика - PullRequest
0 голосов
/ 21 июня 2019

Может кто-нибудь помочь мне с 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());

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

1 Ответ

1 голос
/ 24 июня 2019

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

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

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

publish () не приведет к нескольким подпискам на тело.

...