我想在上一个返回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!");
}
在doOnNext
返回sendEmail
之后如何调用Mono<Void>
或类似方法?
答案 0 :(得分:5)
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();
此打印“确定”:
Mono<String> m=Mono.just("test");
Mono<Void> v=m.then();
v.doOnSuccess(x->System.out.println("OK")).subscribe();
答案 1 :(得分:2)
doOnNext
,通常所有doOn*
反应器方法都是副作用方法。您不应该叫他们做I / O工作或链式操作,而要记录事情而不做任何会影响应用程序状态的事情。
在您的代码示例中,notificationLogReactiveRepository.save
返回Mono<Void>
。 saveNotificationLog
返回void
,并且没有订阅notificationLogReactiveRepository.save
返回的发布者。这意味着该通知将不会保存,因为nothing happens until you subscribe。
在这种情况下,您似乎正在尝试链接操作-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());
}
答案 2 :(得分:0)
尝试一下:
Mono.empty().then()