How to Extract a Mono’s Content in Java
1.概述
在我们的Project Reactor简介中,我们了解了Mono < T >,它是typeT实例的发布者。
在本快速教程中,我们将展示一种从Mono:block andsubscribe提取T的阻塞和非阻塞方式。
2. 封锁方式 span>
通常,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); |
如果发布者未在设置的持续时间内发出值,则 span> RuntimeException span> 。 span>
另外,Mono可以为空,并且上面的block()方法将返回null。在这种情况下,我们可以改为使用blockOptional:
1 2 | Optional<String> result = Mono.<String>empty().blockOptional(); assertEquals(Optional.empty(), result); |
通常,阻塞与反应式编程的原理相矛盾。不鼓励在响应式应用程序中阻止执行。
因此,现在让我们看看如何以非阻塞方式获取值。
3. 无阻塞 span> 方法 span>
首先,我们应该使用subscribe()方法以非阻塞方式进行订阅。另外,我们将指定最终值的使用者:
1 2 | blockingHelloWorld() .subscribe(result -> assertEquals(expected, result)); |
在这里,即使花费一些时间来产生该值,执行也将立即继续,而不会阻塞subscribe()调用。
在某些情况下,我们想在中间步骤中使用该值。因此,我们可以使用运算符来添加行为:
1 2 3 | blockingHelloWorld() .doOnNext(result -> assertEquals(expected, result)) .subscribe(); |
4。结论
在这篇简短的文章中,我们探讨了使用Mono
与往常一样,该代码示例可在GitHub上找到。