如何用Java提取Mono的内容

How to Extract a Mono’s Content in Java

1.概述

在我们的Project Reactor简介中,我们了解了Mono < T >,它是typeT实例的发布者。

在本快速教程中,我们将展示一种从Mono:block andsubscribe提取T的阻塞和非阻塞方式。

2. 封锁方式

通常,Mono通过在某个时间点发射元素来成功完成。

让我们从示例发布者Mono 开始:

1
2
3
4
5
6
Mono<String> blockingHelloWorld() {
    return Mono.just("Hello world!");
}

String result = blockingHelloWorld().block();
assertEquals("Hello world!", result);

在这里,只要发布者不发出该值,我们就会阻止执行。但是,它可能需要任何时间才能完成。

为了获得更多控制权,让我们设置一个明确的持续时间:

1
2
String result = blockingHelloWorld().block(Duration.of(1000, ChronoUnit.MILLIS));
assertEquals(expected, result);

如果发布者未在设置的持续时间内发出值,则 RuntimeException

另外,Mono可以为空,并且上面的block()方法将返回null。在这种情况下,我们可以改为使用blockOptional:

1
2
Optional<String> result = Mono.<String>empty().blockOptional();
assertEquals(Optional.empty(), result);

通常,阻塞与反应式编程的原理相矛盾。不鼓励在响应式应用程序中阻止执行。

因此,现在让我们看看如何以非阻塞方式获取值。

3. 无阻塞 方法

首先,我们应该使用subscribe()方法以非阻塞方式进行订阅。另外,我们将指定最终值的使用者:

1
2
blockingHelloWorld()
  .subscribe(result -> assertEquals(expected, result));

在这里,即使花费一些时间来产生该值,执行也将立即继续,而不会阻塞subscribe()调用。

在某些情况下,我们想在中间步骤中使用该值。因此,我们可以使用运算符来添加行为:

1
2
3
blockingHelloWorld()
  .doOnNext(result -> assertEquals(expected, result))
  .subscribe();

4。结论

在这篇简短的文章中,我们探讨了使用Mono 产生的值的两种方法。

与往常一样,该代码示例可在GitHub上找到。