当前位置: 首页 > 知识库问答 >
问题:

如何有条件地执行Reactor的单通量/通量供应商操作?

杭英杰
2023-03-14

如何有条件地执行

我有一个返回Mono的方法

有人能帮我找到合适的供应商运营商吗?

    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();
    }

-谢谢

共有2个答案

郭辉
2023-03-14

首先,我想强调的是,Reactor的Mono/通量(下一步将考虑Mono)有以下调节操作符(至少我知道):

  • 单声道#开关IFempty
  • Mono#defaultIfEmpty
  • 将Mono#filter和一些其他供应商操作符(例如,Mono#flatMap)组合在一起

第二点是单声道,然后:

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

因此,这意味着无论之前的值是什么,都将返回该值(空的或提供的)。

考虑到所有这些因素,您的解决方案应该是这样的:

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);
}
武琛
2023-03-14

在其源代码中传播错误,因此它涵盖了这方面。据我了解,您不能使用平面地图而不是的原因是源代码为空,这是由于firstMethod()。在这种情况下,将deer()然后()结合起来以实现您所寻求的懒惰:

Mono.just("GOOD_SIGNAL")//It can also be a BAD_SIGNAL
    .flatMap(s -> firstMethod(s))
    .then(Mono.defer(this::secondMethod))
    .subscribe();
 类似资料:
  • 如果我在通量上有两个平面图,它们是否总是按顺序执行

  • 假设我有一个具有方法的存储库,该方法返回的,其中是一个表示美国状态的类,它有两个字段(带有getter/setters):和。 我想获得Flux中所有的填充字段之和。我从Iterable创建了一个Flux,如下所示: 我有我的通量,但我不知道一个好的方法来总结它的价值。我试过 然而,编译器说total“应该是最终的或有效的最终的”。添加显然不会起作用,因为我正在尝试添加。 我如何对通量进行求和(或

  • 我是项目Reactor或反应式编程的新手,所以我可能做错了什么。我正在努力构建一个执行以下操作的流程: 给定类实体: 从DB读取实体(

  • 我需要从Reactor项目中解释这两种方法 文档链接 发布() 准备一个可连接的通量,该通量共享该通量序列,并以背压感知的方式向订户发送值。 和 发布(整型预取) 准备一个可连接的通量,该通量共享该通量序列,并以背压感知的方式向订户发送值。 大理石图对两者都是一样的。什么是参数? 我运行了这些例子,结果是一样的

  • 我有这个界面: 我想测试它的实现,但我得到: 在测试中,我使用: 我错过了什么

  • 顺便说一句,我还在学习WebLUX;我不知道这是不是可能的,或者我有错误的方法,但考虑到这种平行的通量。 调用具有webclient请求的方法(service.getamono) 我需要等待enablers Flux的流结束,并处理它内部的所有响应,原因是如果其中一个给我错误或否定的响应,我不会运行这个其他并行Flux的阻塞器 我想过“zip”方法,但这一个合并了两个响应,并不是我想要的,如果任何