Ваш фрагмент кода нарушает несколько правил, которым вы должны строго следовать:
Вы не должны вызывать subscribe
из метода / лямбды, который возвращает реактивный тип, такой как Mono
или Flux
; это отделит выполнение от основной задачи, в то время как они все еще будут работать в этом общем состоянии. Это часто заканчивается проблемами, потому что вещи пытаются читать дважды один и тот же поток. Это как если бы вы пытались создать два отдельных потока, которые пытаются читать на одном и том же выходном потоке.
Вы не должны выполнять операции ввода-вывода в doOnXYZ
операторах. Это операторы с «побочными эффектами», что означает, что они полезны для регистрации, счетчиков приращений.
То, что вы должны вместо этого попытаться связать операторов Reactor для создания единого реактивного конвейера и вернуть реактивный тип, чтобы конечный клиент подписался на него. В приложении Spring WebFlux клиенты HTTP (через механизм WebFlux) подписываются.
Ваш фрагмент кода может выглядеть следующим образом:
Mono<User> result = context.getPayload(User.class)
.doOnSuccess(user -> System.out.println("############Received user "+user))
.flatMap(user -> {return userRepository.save(user)})
.doOnSuccess(user -> System.out.println("############ Saved "+user));
return result;