Функция теперь выполняется правильно после подписки - PullRequest
0 голосов
/ 31 августа 2018

У меня есть объект Mono, на который я подписан на doOnsuccess. В этом методе я снова сохраняю данные в БД (CouchBase Using ReactiveCouchbaseRepository). после этого я не получаю никаких журналов для Line1 и Line2.

Но это работает нормально, если я не сохраняю этот объект, значит я получаю журналы для строки 2.

   Mono<User> result = context.getPayload(User.class);
     result.doOnSuccess( user -> {
      System.out.println("############I got the user"+user);
      userRepository.save(user).doOnSuccess(user2->{
                System.out.println("user saved");  // LINE 1
              }).subscribe();
      System.out.println("############"+user); // LINE2
    }).subscribe();

1 Ответ

0 голосов
/ 01 сентября 2018

Ваш фрагмент кода нарушает несколько правил, которым вы должны строго следовать:

Вы не должны вызывать 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;
...