以前に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());
}
メソッドsendEmail
returns 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!");
}
doOnNext
がMono<Void>
を返した後にsendEmail
または同様のメソッドを呼び出す方法
doOnNext
、および一般にすべてのdoOn*
リアクタメソッドは副作用メソッドです。 I/O作業やチェーン操作を行うためにそれらを呼び出すことは想定されていませんが、ログに記録し、アプリケーションの状態に影響を与えることは何もしません。
コードサンプルでは、notificationLogReactiveRepository.save
はMono<Void>
を返します。 saveNotificationLog
はvoid
を返し、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());
}
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();
このようにしてみてください:
Mono.empty().then()