[英]Method call after returning 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());
}
方法sendEmail
返回Mono<Void>
。
那么如何调用saveNotificationLog
呢?
UPD:试图让我的问题更简单:
@Override
public Mono<Void> sendEmail(EmailDto emailDto) {
return mailReactiveClient.sendEmail(message ->
createMessage(emailDto, emailDto.getBody(), message))
.doOnNext(System.out.print("Hello world!");
}
如何在sendEmail
返回Mono<Void>
后调用doOnNext
或类似方法?
Mono 不会发出数据,因此不会触发doOnNext
。 您应该改用doOnSuccess
。
此外,您的 Mono 需要消耗。 没有代码,我们不知道它是不是。
这里有一些例子:我添加了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();
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.empty().then()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.