返回 Mono<Void> 后的方法调用
Method call after returning Mono<Void>
我想在上一个 returned 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
?
更新: 试图让我的问题更简单:
@Override
public Mono<Void> sendEmail(EmailDto emailDto) {
return mailReactiveClient.sendEmail(message ->
createMessage(emailDto, emailDto.getBody(), message))
.doOnNext(System.out.print("Hello world!");
}
如何在sendEmail
return 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
returns Mono<Void>
。 saveNotificationLog
returns 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());
}
这样试试:
Mono.empty().then()
我想在上一个 returned 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
?
更新: 试图让我的问题更简单:
@Override
public Mono<Void> sendEmail(EmailDto emailDto) {
return mailReactiveClient.sendEmail(message ->
createMessage(emailDto, emailDto.getBody(), message))
.doOnNext(System.out.print("Hello world!");
}
如何在sendEmail
return 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
returns Mono<Void>
。 saveNotificationLog
returns 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());
}
这样试试:
Mono.empty().then()