如何有条件地执行Reactor的Mono / Flux供应商运营商?

时间:2019-08-28 23:32:01

标签: java spring-webflux project-reactor

如何有条件地执行then(Mono<T>)运算符?

我有一个返回then的方法。它还可以返回错误信号。我只想在没有错误信号的情况下完成上一个操作时才使用 public static void main(String[] args) { Mono.just("GOOD_SIGNAL")//It can also be a BAD_SIGNAL .flatMap(s -> firstMethod(s)) .then(secondMethod()) .subscribe() ; } 运算符(或任何其他运算符)。

有人可以帮助我找到合适的供应商吗?

    private static Mono<String> secondMethod() {
        //This method call is only valid when the firstMethod is success
        return Mono.just("SOME_SIGNAL");
    }
    private static Mono<Void> firstMethod(String s) {
        if ("BAD_SIGNAL".equals(s)) {
            Mono.error(new Exception("Some Error occurred"));
        }

        return Mono
                .empty()//Just to illustrate that this function return Mono<Void>
                .then();
    }
{{1}}

-谢谢

2 个答案:

答案 0 :(得分:0)

then在其来源中传播错误,因此涵盖了这一方面。据我了解,不能使用flatMap而不是then的原因是由于firstMethod(),源是空的。在这种情况下,请结合defer()then()来实现您所追求的懒惰:

Mono.just("GOOD_SIGNAL")//It can also be a BAD_SIGNAL
    .flatMap(s -> firstMethod(s))
    .then(Mono.defer(this::secondMethod))
    .subscribe();

答案 1 :(得分:0)

好吧,所以,首先,我想强调一下Reactor的Mono / Flux(接下来将考虑使用Mono)具有以下条件运算符(至少我所知道的):

第二点是我想注意到Mono#then

  

忽略此Mono的元素,并将其完成信号转换为提供的Mono的发射和完成信号。在生成的Mono中重播错误信号。

因此,这意味着then仍将返回值(空值或提供的值)

考虑所有这些,您的解决方案将如下所示:

public static void main(String[] args) {
        Mono.just("GOOD_SIGNAL")//It can also be a BAD_SIGNAL
                .flatMap(s -> firstMethod(s))
                .switchIfEmpty(secondMethod())
                .doOnError(...)//handle you error here
                .subscribe();
    }

private static Mono<String> secondMethod() {
     //This method call is only valid when the firstMethod is success
     return Mono.just("SOME_SIGNAL");
}

private static Mono<Void> firstMethod(String str) {
    return Mono.just(str)
               .filter(s -> "BAD_SIGNAL".equals(s))
               .map(s -> new Exception("Some Error occurred: "+s))
               .flatMap(Mono::error);
}