如何迭代 Flux 并与 Mono 混合

2024-01-08

我有一个应该向用户发送电子邮件的用例。 首先,我创建电子邮件正文。

Mono<String> emailBody = ...cache();

然后我选择用户并向他们发送电子邮件:

Flux.fromIterable(userRepository.findAllByRole(Role.USER))
            .map(User::getEmail)
            .doOnNext(email -> sendEmail(email, emailBody.block(), massSendingSubject))
            .subscribe();

我不喜欢什么

  1. 如果没有cache()方法,emailBody Mono会在每个迭代步骤中进行计算。
  2. 为了获取 emailBody 值,我使用 emailBody.block() 但也许有一种反应式方法,而不是在 Flux 流中调用 block 方法?

此代码示例中有几个问题。 我假设这是一个反应式 Web 应用程序。

首先,不清楚您如何创建电子邮件正文;您是从数据库还是远程服务中获取内容?如果它主要受 CPU 限制(而不是 I/O),那么您不需要将其包装为响应式类型。现在如果它应该是包装在Publisher并且电子邮件内容对于所有用户都是相同的,使用cache运营商是一个不错的选择。

Also, Flux.fromIterable(userRepository.findAllByRole(Role.USER))建议您从反应式上下文中调用阻塞存储库。

你应该never在 a 中执行大量 I/O 操作doOn***操作员。这些是为日志记录或轻微副作用操作而设计的。事实是你需要.block()这是另一个线索,表明您将阻塞整个反应管道。

最后一篇:你不应该打电话subscribeWeb 应用程序中的任何位置。如果这绑定到 HTTP 请求,那么您基本上会触发反应式管道,而无法保证资源或完成情况。呼唤subscribe触发管道但不会等到它完成(此方法返回一个Disposable).

一个更“典型”的示例如下所示:

Flux<User> users = userRepository.findAllByRole(Role.USER);
String emailBody = emailContentGenerator.createEmail();


// sendEmail() should return Mono<Void> to signal when the send operation is done
Mono<Void> sendEmailsOperation = users
     .flatMap(user -> sendEmail(user.getEmail(), emailBody, subject))
     .then();

// something else should subscribe to that reactive type,
// you could plug that as a return value of a Controller for example

如果您不知何故被阻塞组件困住了(sendEmail例如,一),您应该在特定的调度程序上安排这些阻塞操作,以避免阻塞整个反应管道。为此,请查看反应堆参考文档中的调度程序部分 http://projectreactor.io/docs/core/release/reference/#schedulers.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何迭代 Flux 并与 Mono 混合 的相关文章

随机推荐

  • 如何让 .env 预提交 + mypy + django-stubs

    我尝试在提交之前配置启动 mypy django stubs 检查 我使用预提交 当我尝试提交时 出现错误django core exceptions ImproperlyConfigured 设置 POSTGRES DB 环境变量 该变量
  • java.sql 中的日期时间等效项? (有 java.sql.datetime 吗?)

    到目前为止 我还没有找到明确的答案 我想知道使用PreparedStatement 的SQL 类型DATETIME 和java 类型的等价物是什么 我已经发现 http www java2s com Code Java Database S
  • Shell 脚本中的 exec ${PERL-perl} -Sx $0 ${1+"$@"} 是什么意思?

    我的任务是将包含 Shell 脚本 Perl 代码的 shell 脚本转换为 Python 我设法将 Perl 代码转换为 Python 但是有这个shell脚本语句我不明白 usr bin sh exec PERL perl Sx 0 1
  • 没有元素时流的特殊行为

    我如何用 java 8 Streams API 表达这一点 我想表演itemConsumer对于流的每个项目 如果有 没有我想要执行的项目emptyAction 当然我可以写这样的东西 Consumer itemConsumer Syste
  • 没有画布的 HTML5 getImageData [重复]

    这个问题在这里已经有答案了 有没有办法在没有画布的情况下使用图像的 getImageData 我想要获取图像鼠标位置处的像素颜色 不 你不能 但是获取 imageData 可以使用内存中的画布来完成 这既快速又简单 var canvas d
  • Powershell ISE 在使用 GitLab Runner 时抛出 RemoteException

    I am trying to stop GitlabRunner windows service using powershell When I execute the command in elevated powershell prom
  • 如何使用可视化代码编辑器在 chrome 上运行 flutter

    如何在 Chrome 上运行 flutter 应用程序 我已经安装了颤振套件并运行 颤振通道测试版 颤振升级 并在 Visual Studio Code 上安装扩展 就像与flutter mobile create flutter laun
  • Python内存模型和指针

    我正在学习 Python 并对 Python 的内存模型感到困惑 变量包含它所引用的对象的内存地址 这听起来就像 Python 变量实际上是指针 因为它们只直接包含实际对象实例的内存地址 那么当我调用变量名时Python会做什么呢 Pyth
  • 在 Python 中将频谱图存储为图像

    我想将音频的 STFT 频谱图存储为图像 下面的代码向我显示了一个频谱图作为输出 但是当保存为图像时 我得到了不同的图像 import numpy as np import matplotlib pyplot as plt import p
  • UICollectionViewCell 中的标签文本未更新

    我正在尝试更改 a 的文本UILabel in a UICollectionViewCell之后UICollectionViewCell已加载 当点击button 但屏幕上的标签不会更新 控制台显示标签的文本属性已更新 但标签似乎并未使用新
  • 对于没有正文的 4xx 错误,Content-Type 应该是什么?

    考虑一个获得以下响应的 HTTP 请求 405 Method Not Allowed Content Length 0 像这样的内容类型应该是什么 设置为无 Not set Set to text plain or text html 您没
  • Lucene.net 2.9.2 排序(排序不起作用)

    我在 NET 中对 lucene net 索引进行排序时遇到问题 我尝试了 stackoverflow 上的几乎所有解决方案并寻找谷歌答案 我正在使用 Lucene NET 2 9 2 和 ASP NET 2 0 我想像在 sql 中一样对
  • 如何在适用于 iOS 的谷歌地图 sdk 中设置带有位置的中心地图视图

    如何在 iOS 版谷歌地图 sdk 中设置中心地图视图和位置 使用mapkit 我们可以执行setCenter Location 如何使用适用于 iOS 的 google 地图 sdk 执行此操作 使用 GMSCameraPosition
  • 从种子点生成特定半径内的随机地理坐标

    我使用以下函数从种子点生成指定半径内的随机地理坐标 function randomGeo center radius var y0 center latitude var x0 center longitude var rd radius
  • 如何在 Java 中挂载 Windows 驱动器?

    我们正在使用一些通过字母 例如 f 访问共享驱动器的遗留代码 使用 UNC 表示法不是一个选项 我们的 Java 包装应用程序将作为服务运行 作为第一步 我想在代码中显式映射驱动器 有人这样做过吗 考虑执行映射网络驱动器的 DOS 命令 如
  • CPU-GPU并行编程(Python)

    有没有一种方法可以在 CPU 和 GPU 上同时运行函数 使用 Python 我已经在使用 Numba 对 GPU 上的计算密集型函数进行线程级调度 但我现在还需要在 CPU GPU 之间添加并行性 一旦我们确保 GPU 共享内存拥有开始处
  • 使用 StringBuilder 随机化文本框中的行顺序

    我试图随机化最终结果 这里的想法是让文本框行执行一些代码 然后将其导出到 textbox2 代码正在工作 但我想在导出到 textbox2 时随机化行顺序 Dim newr As New StringBuilder For Each lin
  • 滚动 ExpandableListView 后计数器的值发生变化

    我有一个 ExpandableListView 项目 在列表项上我有 TextView 其中有两个按钮可以在单击时增加或减少 TextView 中的值 每次我尝试滚动列表时都会出现此问题 如果我增加一项 然后滚动列表 值就会混合 因为 Li
  • EF Code First 中的小数精度和小数位数

    我正在尝试这种代码优先的方法 但我现在发现 System Decimal 类型的属性被映射到 Decimal 18 0 类型的 sql 列 如何设置数据库列的精度 戴夫 范 登 艾德 Dave Van den Eynde 的答案现已过时 有
  • 如何迭代 Flux 并与 Mono 混合

    我有一个应该向用户发送电子邮件的用例 首先 我创建电子邮件正文 Mono