我可以运行2个Mono异步Reactor Core吗?

时间:2018-05-28 17:33:08

标签: java mono flux project-reactor

在java中:

    Mono<response> response = mon.just()
    Mono<object> object = mono.just()
    return response.block()

响应和对象不相互依赖。 有没有办法同时运行2个单声道?

2 个答案:

答案 0 :(得分:1)

有多种方式。一个简单的解决方案是使用subscribeOn运算符:

Mono<response> response = Mono.just(...).subscribeOn(Schedulers.elastic());
Mono<object> object = Mono.just(...).subscribeOn(Schedulers.elastic());

每当有人订阅你的Monos时,它都会发生在另一个线程中。在这种情况下,线程从现有池中获取。 Schedulers提供了多种方法,允许您使用现有线程或创建新线程(请参阅documentation)。

如果您对反应流和多线程感兴趣,我最近写了一篇关于它的article

答案 1 :(得分:0)

如果这两个Mono以任何方式彼此无关,并且您想要并行运行它们,那么我建议您考虑一下您的设计。

如果您想并行运行它们并在两个结果都可用时使用它们的结果:

Mono<Integer> source1 = Mono.just(1).subscribeOn(Schedulers.elastic());
Mono<String> source2 = Mono.just("aaaa").subscribeOn(Schedulers.elastic());

Mono.zip(source1, source2, (integer, string) -> string.concat(integer.toString()))
        .subscribe(x -> System.out.println(x));

输出:

"aaaa1"

如果结果类型相同(但没有重新获得),那么你可以这样做:

Mono<Integer> source1 = Mono.just(1).subscribeOn(Schedulers.elastic());
Mono<Integer> source2 = Mono.just(2).subscribeOn(Schedulers.elastic());

Flux.merge(source1, source2)
        .map(number -> number * 10)
        .subscribe(x -> System.out.println(x));

请注意,您不能指望哪个元素可用,因此我们使用Flux来表示2个结果,而在第一个示例中,我们使用Mono来表示一个包含2个结果的结果

输出:

10
20
or
20
10

More information about Scheduler class, available Schedulers in reactor lib and subscribeOn operation.