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

如何操作来自流量的对象,而值来自以非阻塞方式发出单个的方法?

邢宏浚
2023-03-14

我试图用从Mono接收的数据来操作从Flux接收的对象,其中发出对象的Flux和项的Mono的方法都是不同的API调用。问题是,我无法控制线程,从Mono接收的项永远不会分配给我的对象,除非我故意阻止()那个线程。请建议是否有任何非阻塞的方式可能为这种情况。

我还研究了调度器、订阅器、发布器,但无法找出管道。

public Flux<Object> test {

 method1().map(obj -> {
        if (obj.getTotalItems() > 20) {
            obj.setItems(method2(obj).block());
        }
        return obj;
  });
}

这里,method1是发射从API命中接收的对象的流量。

并且method2正在发出从另一个API命中中获取的项列表。

我怎样才能使这整个流动不阻塞?

共有1个答案

唐钊
2023-03-14

使用flatmap运算符,可以在非阻塞公共中扁平化子流

Flux<Object> test {

 method1().flatMap(obj -> {
        if (obj.getTotalItems() > 20) {
            return method2(obj)
                     .map(result -> {
                        obj.setItems(result);
                        return obj;
                     });
        }
        return Mono.just(obj);
  });
}

flatMap允许您一次扁平化几个流,因此在长时间运行的操作中,您可以使用更高效的流程元素。

flatMap的一个缺点是它不保留元素的顺序,因此如果您有一个上游元素序列,如[1,2,3,4]flatMap,则由于子流的异步性质,顺序可能会改变。

要保留顺序,可以使用concatmap,它一次只对流进行一次扁平化,因此可以保证将保留扁平化元素的顺序:

Flux<Object> test {

 method1().concatMap(obj -> {
        if (obj.getTotalItems() > 20) {
            return method2(obj)
                     .map(result -> {
                        obj.setItems(result);
                        return obj;
                     });
        }
        return Mono.just(obj);
  });
}

这样的对象突变方式不是最好的主意,我更喜欢在反应性编程中使用不可变的对象模式object

 类似资料:
  • 问题内容: 题: 在这里,“ MyClass”类可以通过调用“ Object”类中的clone方法来克隆其自己的对象。当我尝试在同一包“ GoodQuestions”中的另一个类(“ TestSingleTon”)中克隆此类(“ MyClass”)的类时,会引发以下编译时错误。 “来自对象类型的方法clone()不可见 ” 所以这是引发上述错误的代码? 问题答案: 发生此错误的原因是在对象类中cl

  • 一份关于我问题的文件 所以基本上,我有一个自定义的useFetch钩子,可以返回一些数据和其他东西。 在“recipe”变量中,我有一个由“title、cookingTime、method”等组成的对象。 我的问题是,如何解构这个配方对象为: 如果我把它放在useFetch钩子下面,这段代码就不起作用了,因为起初,它在进入useFetch内部的use效应钩子之前是空的,有什么想法吗?

  • 问题内容: 最近几天,我一直在与Numpy和matplotlib一起玩。我在尝试使matplotlib绘制函数而不阻止执行时遇到问题。我知道这里已经有很多线程在问类似的问题,并且我已经在Google上搜索了很多,但是没有设法使这项工作有效。 我曾尝试按照某些人的建议使用show(block = False),但是我得到的只是一个冻结的窗口。如果我简单地调用show(),则将正确绘制结果,但执行将被

  • 在过去的几天里,我一直在玩Numpy和matplotlib。我有问题试图使matplotlib图函数不阻塞执行。我知道已经有很多线程在SO上问类似的问题,我已经谷歌了很多,但还没有成功。 我尝试过使用show(block=False),就像一些人建议的那样,但我得到的只是一个冻结的窗口。如果我简单地调用show(),结果会被正确绘制,但执行会被阻止,直到窗口关闭。从我读过的其他线程中,我怀疑sho

  • 我有一个顶点,它有一个处理程序,可以在事件循环线程中调用Vertx的Web客户端。实际的底层API调用是同步的还是异步的?它会阻塞我的事件循环线程吗?假设我的API调用需要30秒才能返回。 我是否需要用Vertx.execute阻塞(p-

  • 我正在使用Spring WebFlux WebClient从外部API检索数据,如下所示: 这很好,并产生如下响应: 但我只对“temp”属性感兴趣(主要- 我知道第一件事是用“.exchange()”替换“.retrieve()”,但我不知道如何使它工作。 PS:这是我的第一个问题。如果我做错了什么,或者你需要更多细节,请告诉我。 谢啦!