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

Spring反应器Thread模型

阮阳曦
2023-03-14

我的理解是Spring Webflux提供了一个非阻塞/异步并发模型。然而,我得到了一个需要帮助的基本问题。作为一个免责声明,这种反应编程的整个概念对我来说是非常新的,我仍然处于这种范式转变的过程中。

请考虑以下代码:

Mono.just("ONE")
.map(item -> func(" A " + item))
.map(item -> func(" B " + item))
.map(item -> func(" C " + item))
.subscribe(System.out::println);

Mono.just("TWO")
.map(item -> func(" A " + item))
.map(item -> func(" B " + item))
.map(item -> func(" C " + item))
.subscribe(System.out::println);

我从文档中了解到,在调用“subscribe”函数之前,事件处理链不会发生任何事情。

我注意到代码总是按顺序运行,并且使用相同的线程。spring WebFlux的线程模型是什么?

共有1个答案

金旺
2023-03-14

反应编程是一种编程范例,因此它不对技术实现做任何假设。

reactive manifesto描述了reactive系统,并将异步通信和背压放在桌面上。除此之外,它也没有对技术细节做任何假设。

Spring Reactor是Webflux的基础,它是一个库,允许您轻松地构建反应性系统并遵循反应性编程范例。

Flux.interval(Duration.ofMillis(100))
    .take(2)
    .subscribe(i -> System.out.println(Thread.currentThread().getName()));

再来看一个例子:

Scheduler scheduler = Schedulers.newElastic("foo");

Flux<Integer> flux = Flux.just(1, 2)
    .subscribeOn(scheduler);

flux.subscribe(i -> System.out.println(Thread.currentThread().getName()));
flux.subscribe(i -> System.out.println(Thread.currentThread().getName()));

您将注意到,每个订阅服务器都运行在自己的线程上(尽管来自相同的线程池)。publishon运算符与此类似。

如果您订阅了发布服务器,则可以使用相同的编程范例,而不管它是同步的还是异步的。并且始终可以通过添加subscribeonpublishon运算符引入异步行为。

 类似资料:
  • 我用的是Spring助焊剂。我需要从不同的来源组装一个物体。如何确保两个流都返回了所需的数据? 比如:

  • 问题内容: 以下是React中的反模式吗?我喜欢这种模式,因为当实例化一个组件时,它在静态函数中为我提供了上下文。然后,我可以导入该类并调用静态方法来修改状态。还是可以通过更好的方式来完成? 问题答案: 显然,这取决于条件,可能是一种反模式,也可能是一个错误。静态类方法不应与类实例一起使用。绑定到特定的组件实例和用途,这只能证明类是单例是合理的(尽管单例也经常是反模式)。如果期望有多个类实例,那么

  • 我在查阅Spring Data Elasticsearch store的文档时,遇到了以下问题: 有关反应性支持的更多详细信息,请参阅特定于存储的留档。 虽然我已经在elasticsearch商店留档中,但我没有找到任何关于反应性支持的进一步信息。我在哪里可以找到关于这方面的进一步信息?

  • 这可能看起来是一个非常有趣和愚蠢的问题。。 我试着在Android应用程序中使用可运行程序、线程、服务和意向服务来查看后台操作。 所以我创建了一个活动,并在活动中创建了一个简单的线程,比如, 因此,在上述场景中,按钮文本正在发生变化。 没关系,我打电话是这样的: 或 为什么我的按钮文本通过调用start()而改变-何时使用背景线程? 现在是一个非常有趣的场景;如果我延迟2秒,就像这样; 如果调用s

  • 我正在将spring状态机工作代码迁移到3.0.0版本,以获得反应实现的好处,当我调用

  • 我正在做我的项目,我注意到当严格模式打开时,它会将两个相同的元素推入我的数组。当严格模式关闭时,它只将一个元素推入数组。有什么解释为什么会这样吗? 这是我的状态。