如何在 Reactor 中使用 Mono 的内容
How to use Mono's content in Reactor
我正在尝试调用响应式 REST API 来获取 deadlinesTS 变量。
然后我试图在我的 Pojo class 中设置相同的设置。
但是BOLCompliance中设置deadlineTS后的值与subscribe()不一致。有时我能够设置值,有时我得到空值。我怎样才能确保每次都能设置值。
Mono<String> deadlineTS = portCallServiceCaller.getDeadlineTSByComplianceId(compliance.getId());
BOLCompliance complianceResponse = new BOLCompliance();
deadlineTS.subscribe(val->complianceResponse.setDeadlineTimestamp(val));
在反应管道之外使用 Mono 的内容(阻塞)
您可以像这样使用 block()
方法:
Mono<String> nameMono = Mono.just("some-value").delayElement(Duration.ofMillis(300));
Person person = new Person();
person.setName(nameMono.block());
System.out.println(person.getName());
这会触发操作并等待其完成。请注意调用线程阻塞。
或者,您可以使用 subscribe(consumer, errorConsumer, completeConsumer) 并提供将在操作完成时触发的 Runnable
:
valueMono.subscribe(v-> person.setName(v), throwable -> {}, () -> System.out.println(person.getName()));
但是,subscribe()
方法会立即 return。
在反应管道中使用 Mono 的内容
您可以根据情况选择提供的运算符之一。
在这种情况下,您可以使用 map
运算符将 String
转换为 BOLCompliance
:
Mono<BOLCompliance> fetchBOLCompliance() {
Mono<String> deadlineMono = portCallServiceCaller.getDeadlineTSByComplianceId(compliance.getId();
return deadlineMono.map(deadline -> {
BOLCompliance compliance = new BOLCompliance();
compliance.setDeadlineTimestamp(deadline);
return compliance;
});
}
如果您想 运行 一个异步任务(例如数据库访问),您需要使用 flatmap
运算符。
立即订阅()returns
根据Javadoc:
Disposable subscribe(Consumer<? super T> consumer)
Keep in mind that since the sequence can be asynchronous, this will
immediately return control to the calling thread. This can give the
impression the consumer is not invoked when executing in a main thread
or a unit test for instance.
换句话说,subscribe 方法会立即启动 odd 工作和 returns。所以你不能保证操作已经完成。例如,以下示例将始终以空值结束:
Mono<String> nameMono = Mono.just("some-value").delayElement(Duration.ofMillis(300));
Person person = new Person();
nameMono.subscribe(v-> person.setName(v));
System.out.println(person.getName());
此处,person.getName()
方法被立即调用,而 person.setName(v)
方法在 300 毫秒后被调用。
我正在尝试调用响应式 REST API 来获取 deadlinesTS 变量。 然后我试图在我的 Pojo class 中设置相同的设置。 但是BOLCompliance中设置deadlineTS后的值与subscribe()不一致。有时我能够设置值,有时我得到空值。我怎样才能确保每次都能设置值。
Mono<String> deadlineTS = portCallServiceCaller.getDeadlineTSByComplianceId(compliance.getId());
BOLCompliance complianceResponse = new BOLCompliance();
deadlineTS.subscribe(val->complianceResponse.setDeadlineTimestamp(val));
在反应管道之外使用 Mono 的内容(阻塞)
您可以像这样使用 block()
方法:
Mono<String> nameMono = Mono.just("some-value").delayElement(Duration.ofMillis(300));
Person person = new Person();
person.setName(nameMono.block());
System.out.println(person.getName());
这会触发操作并等待其完成。请注意调用线程阻塞。
或者,您可以使用 subscribe(consumer, errorConsumer, completeConsumer) 并提供将在操作完成时触发的 Runnable
:
valueMono.subscribe(v-> person.setName(v), throwable -> {}, () -> System.out.println(person.getName()));
但是,subscribe()
方法会立即 return。
在反应管道中使用 Mono 的内容
您可以根据情况选择提供的运算符之一。
在这种情况下,您可以使用 map
运算符将 String
转换为 BOLCompliance
:
Mono<BOLCompliance> fetchBOLCompliance() {
Mono<String> deadlineMono = portCallServiceCaller.getDeadlineTSByComplianceId(compliance.getId();
return deadlineMono.map(deadline -> {
BOLCompliance compliance = new BOLCompliance();
compliance.setDeadlineTimestamp(deadline);
return compliance;
});
}
如果您想 运行 一个异步任务(例如数据库访问),您需要使用 flatmap
运算符。
立即订阅()returns
根据Javadoc:
Disposable subscribe(Consumer<? super T> consumer)
Keep in mind that since the sequence can be asynchronous, this will immediately return control to the calling thread. This can give the impression the consumer is not invoked when executing in a main thread or a unit test for instance.
换句话说,subscribe 方法会立即启动 odd 工作和 returns。所以你不能保证操作已经完成。例如,以下示例将始终以空值结束:
Mono<String> nameMono = Mono.just("some-value").delayElement(Duration.ofMillis(300));
Person person = new Person();
nameMono.subscribe(v-> person.setName(v));
System.out.println(person.getName());
此处,person.getName()
方法被立即调用,而 person.setName(v)
方法在 300 毫秒后被调用。