web-dev-qa-db-ja.com

Mono <Void>を返した後のメソッド呼び出し

以前にMono<Void>が返されたときにメソッドを呼び出したい:

 @Override
 public Mono<Void> sendEmail(EmailDto emailDto) {
 return mailReactiveClient.sendEmail(message ->
     createMessage(emailDto, emailDto.getBody(), message))
       .doOnNext(saveNotificationLog(emailDto)); //it's not work
}

  private void saveNotificationLog(EmailDto emailDto) {
    notificationLogReactiveRepository.save(NotificationLog.builder()
       ...
      .build());
  }

メソッドsendEmailreturns Mono<Void>

では、saveNotificationLogを呼び出す方法は?

PD:私の質問を簡単にするためのトリング:

 @Override
 public Mono<Void> sendEmail(EmailDto emailDto) {
 return mailReactiveClient.sendEmail(message ->
     createMessage(emailDto, emailDto.getBody(), message))
       .doOnNext(System.out.print("Hello world!"); 
}

doOnNextMono<Void>を返した後にsendEmailまたは同様のメソッドを呼び出す方法

5
kostepanych

doOnNext、および一般にすべてのdoOn*リアクタメソッドは副作用メソッドです。 I/O作業やチェーン操作を行うためにそれらを呼び出すことは想定されていませんが、ログに記録し、アプリケーションの状態に影響を与えることは何もしません。

コードサンプルでは、​​notificationLogReactiveRepository.saveMono<Void>を返します。 saveNotificationLogvoidを返し、notificationLogReactiveRepository.saveが返すパブリッシャーをサブスクライブしません。 サブスクライブするまで何も起こらない であるため、通知は保存されません。

この場合、操作を連鎖させようとしているようです-then演算子はそのためだけに作成されています。コードは次のようになります。

@Override
public Mono<Void> sendEmail(EmailDto emailDto) {
    return mailReactiveClient.sendEmail(message ->
        createMessage(emailDto, emailDto.getBody(), message))
           .then(saveNotificationLog(emailDto));
}

private Mono<Void> saveNotificationLog(EmailDto emailDto) {
    return notificationLogReactiveRepository.save(NotificationLog.builder()
        ...
        .build());
}
6
Brian Clozel

Monoはデータを出力しないため、doOnNextはトリガーされません。代わりにdoOnSuccessを使用してください。

また、モノを消費する必要があります。コードがなければ、それがそうであるかどうかはわかりません。

ここにいくつかの例があります。モノを消費するためにsubscribe()を追加しました。 Monoの使用方法に応じて、同じことを行う必要があります。

これは何も印刷しません:

Mono<String> m=Mono.just("test");
Mono<Void> v=m.then();
v.doOnNext(x->System.out.println("OK")).subscribe();

この印刷は「OK」です。

Mono<String> m=Mono.just("test");
Mono<Void> v=m.then();
v.doOnSuccess(x->System.out.println("OK")).subscribe();
7
wargre

このようにしてみてください:

Mono.empty().then()