如何在 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 毫秒后被调用。