为反应式管道编写方面

2024-01-07

我正在为返回承诺的方法编写方面。考虑以下方法:

public Mono<Stream> publishToKafka(Stream s) {
    //publishToKafka is asynchronous
    return Mono.just(s).flatMap(worker::publishToKafka);
}

我想缓存发布是否成功。由于这是一个横切关注点,因此方面看起来是最好的设计。这是我的看法。

@Around("@annotation....")
public Object cache() {
    //get the data to cache from the annotation
    Object result = pjp.proceed();
    cache.cache("key","data");
    return result;
}

现在自从publishToKafka是异步的,一旦线程切换发生,目标方法就返回cache.cache()叫做。这不是我想要的。我想要的是,如果事件已成功发布到 Kafka,则应缓存结果。以下建议有效。

@Around("@annotation....")
public <T extends Stream<T>> Mono<T> cache() {
    //get the data to cache from the annotation
    return ((Mono<T>)pjp.proceed()).doOnNext(a -> cache.cache(key, data));
}

我想了解这里发生了什么事。这种情况是否发生在管道组装期间?或者在执行期间(pjp.proceed()返回一个承诺),我的建议添加了doOnNext操作员?

我需要在这个示例的上下文中了解汇编与执行时间。


Spring AOP 和 AspectJ 方面始终在与拦截的连接点相同的线程中同步执行。因此,如果您拦截的方法立即返回,并且返回值类似于 Promise、Future 或空(void)与回调的组合,则您不能指望在方面的建议中神奇地获得异步结果。您确实需要让方面了解异步情况。

话虽如此,我还想提一下,我以前从未使用过响应式编程,我只知道这个概念。从我在你的建议中看到的,解决方案应该有效,但有一件事不太好:你让建议返回一个new Mono实例由您返回的doOnNext(..) call https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html#doOnNext-java.util.function.Consumer-。也许返回会更干净original Mono你从proceed()在注册了缓存回调之后,以避免任何副作用。

我不知道还要解释什么,情况已经很清楚了。如果我的解释还不够,请随时提出直接相关的后续问题。

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

为反应式管道编写方面 的相关文章

随机推荐

  • 设计确认在首次发送时无效

    我有一个 Rails 4 应用程序 使用 Devise 3 2 2 confirmable 并且遇到了发送无效确认令牌的问题 但是只是第一次 重新发送确认令牌后 链接将起作用 相关路线 devise for users skip sessi
  • 设置信用卡号格式

    如何在输入时格式化和验证信用卡号 每 4 位数字之间留有空格 eg 4464 6846 4354 3564 我努力了 creditno keyup function cc this val split join cc cc match ne
  • 使用 SwiftUI 的relativeWidth 仅适用于框架视图

    尝试在 SwiftUI 中构建一个条形图元素 其宽度根据元素的值与其父视图成比例 这是问题的简化版本 struct BarView View var body some View Color purple relativeWidth 0 5
  • 在 DB2 中显示表的定义

    大家好 我正在学习DB2 想知道如何 创建表后查看表的特征 类似于MySQL中的EXPLAIN TABLE命令 谢谢 此外DESCRIBE TABLE 您可以使用下面的命令 DESCRIBE INDEXES FOR TABLE tablen
  • 发送多个 HTTP 请求

    我需要编写使用项目 ID 查找有关项目的信息的程序 该 API 一次仅获取一项 因此我只能对每项执行一次查询 API 仅限于五个同时请求 任何额外的结果都会给出 HTTP 429 错误 如果有一个 JavaScript 对象 其中包含所有带
  • WordPress:重置密码始终无效密钥

    我有一个很大的问题 找不到解决方案 我已经安装了 Ultimate Member Plugin 并激活了它 当我现在重置用户的密码时 我会从我的页面收到一封电子邮件 其中包含在class password phpUM函数调用触发的插件文件u
  • ember.js 中是否有一个回调,我可以在状态转换后渲染所有视图后使用它来运行代码?

    我有由三个出口组成的应用程序视图 提出自己的观点 简化
  • 为什么 CSS :not 伪类不能按预期工作?

    考虑以下 HTML div class a div class b Hello div div div class c div class b World div div 按照预期添加以下 CSS 颜色 仅 世界 为红色 c b color
  • 将输入文本字段从 HTML 获取到 JavaScript 并转到 URL

    如何将输入文本字段从 HTML 转换为 JavaScript 并转到 URL 我正在构建一个网页 您可以在输入字段中输入一些单词 Java 会获取该字符串并检查该字符串是否与另一个字符串相等 如果它转到某个 URL 我的代码是
  • Android 相机视频意图返回 null URI

    我最近更新到了 Android 4 3 每当我从应用程序中使用 Intent 启动它时 库存摄像机就开始表现得有点奇怪 起初它只是崩溃并说 图库停止响应 过了一会儿 我能够录制视频 但是单击 完成 会向我的应用程序返回一个空 URI 这导致
  • Perl 中的编译时间和运行时间

    我在读这个文件 http oreilly com catalog pperl3 chapter ch18 html了解 Perl 程序的生命周期 When do run时间和什么时候做compile在命令行上运行 Perl 脚本时发生时间事
  • 几秒钟后清除通知

    当您打开消息活动并且手机收到新消息时 状态栏上会显示一条通知 短时间后 通知将被删除 是否可以对我的活动执行相同的操作 而不使用计时器在几秒钟后清除通知 我不相信有一种方法可以仅使用NotificationManager来取消通知 但您可以
  • Jboss as 7 使用 HTTP 管理 api 进行部署

    如何使用 HTTP 管理 api 将存档部署到 Jboss as 7 我尝试使用从 RHQ 插件类创建的以下代码 公共类Main2 public static final String MANAGEMENT management publi
  • 硬盘序列号可以/为什么会改变

    我们的反盗版软件根据硬盘序列号来识别人员 我相信这是一个恒定的功能 除非用户更改其主要物理驱动器 否则不会改变 如果我错了 请纠正我 我们使用WMIpython模块获取用户的硬盘序列号 我们的 2 台测试计算机的硬盘序列号已更改 但我们根本
  • 为什么我们必须定义一个在类中初始化的 const 静态成员

    我们知道 可以在类结构内部初始化整型 const 静态成员 这在初始化后在类结构中使用常量时很有用 例如 它可以用作 int 数组的大小 看下面的代码 class MyClass static const int num 100 int e
  • 多个线程在同一全局内存位置写入相同的值

    这个问题与以下问题密切相关this one https stackoverflow com questions 8315931 does writing the same value to the same memory location
  • 在文本区域内建议/自动完成的 jQuery 插件 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有一个 jQuery 插件可以在文本区域内建议 自动完成 我想要的是在文本区域中向用户提供建议的单
  • 现代 C 和 C++ 中是否已弃用 f(void)? [复制]

    这个问题在这里已经有答案了 我目前正在重构 整理 C 项目中使用的一些旧 C 代码 并经常看到以下函数 int f void 我倾向于写成 int f 是否有任何理由不在整个代码库中将 void 替换为 以提高一致性 或者两者之间是否存在我
  • 如何使用 cassandra-cli 更新 gc_grace_seconds?

    更新列族并更改其列族的命令是什么gc grace seconds价值利用cassandra cli 对于CQLSH alter table
  • 为反应式管道编写方面

    我正在为返回承诺的方法编写方面 考虑以下方法 public Mono