java - 如何用 Project Reactor 替换 Spring Events
问题描述
假设我有一个巨大的 Spring 应用程序。在其中的一部分中,执行了某种业务逻辑。我还需要执行一些不应该影响主进程的额外操作(例如,重新计算一些指标并将其保存到数据库)。为此,我使用 Spring Event 机制(当然是异步模式)。
@Service
public class MyService {
@Autowired
private ApplicationEventPublisher eventPublisher;
public void doSomeUsefulStuffWithEntity(Long entityId) {
//some operation here
eventPublisher.publishEvent(new EntityHasChangedEvent(Long entityId));
}
}
@Component
public class MyEventListener {
@Async
@EventListener
public void onEntityEvent(EntityHasChangedEvent event) {
//do some stuff here
}
}
很直截了当,不是吗。但是有一种观点认为 Spring Events 主要是为了 Bean 生命周期的目的,而不是为了业务任务。因此问题。什么是我需要的充分替代品?我应该使用以 Project Reactor 为代表的 Publisher-Subscriber 机制吗?如果是这样,它应该是什么样子?Spring Events 给了我不同域模块之间的弱内聚 - 我不知道如何用 Fluxes 实现同样的弱内聚。
解决方案
Project Reactor是一个旨在在 JVM 上构建非阻塞应用程序的库。这主要是出于性能原因,请参阅 Project Reactor 文档或深入阅读State of Loom。
发布-订阅模式与非阻塞应用程序无关,它是一种适用于事件广播的消息模式。
由于这两件事没有可比性,因此您无法真正将其替换为另一件事。
推荐阅读
- php - 如何将 Firebase 身份验证添加到 laravel api 路由
- python - Tensorflow:如何在给定 1 的索引的情况下创建 0 和 1 的一维张量
- c++ - 了解系统级读写函数
- php - php return 停止循环
- scala - 如何更改项目的 sbt 版本
- c++ - 当程序崩溃时输出调用堆栈以及符号名称
- java - 为什么我不能用 viewmodel 作为 LifecycleOwner 来观察数据?
- create-react-app - 为什么我没有本地网络 URL?
- python-3.x - 使用基本 python(没有 pandas 或任何外部库)从 csv 文件中计算每门课程的学生数
- java - 如何比较整数包含在循环中的字符串