【问题标题】:How do I replace Spring Events with Project Reactor如何用 Project Reactor 替换 Spring Events
【发布时间】:2021-03-10 18:16:07
【问题描述】:

假设我有一个巨大的 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 实现同样的弱内聚。

【问题讨论】:

  • 改变你的看法,因为那是错误的。 Spring Security 等使用它来发布身份验证/自动化事件。 Spring 本身会发布有关正在处理的请求等的事件。

标签: java spring publish-subscribe project-reactor


【解决方案1】:

Project Reactor 是一个旨在在 JVM 上构建非阻塞应用程序的库。这主要是出于性能原因,请参阅 Project Reactor 文档或深入阅读 State of Loom

Publish–subscribe pattern 与非阻塞应用程序无关,它是一种适合事件广播的消息传递模式。

由于这两件事没有可比性,你不能真正用另一件事代替。

【讨论】:

  • 但是 Project Reactor 也是 pub-sub 模式的实现。我们是在谈论不同的 pub-sub 吗?
  • Apache Kafka 或 Amazon SNS 也在使用 pub-sub 模式,但我不会使用它们来重新实现 Spring 事件,因为就像 Reactor 一样,它们的目标是别的东西。
猜你喜欢
  • 2021-04-02
  • 2018-09-04
  • 1970-01-01
  • 2019-05-17
  • 2019-01-07
  • 1970-01-01
  • 2018-11-18
  • 2018-09-26
  • 2017-05-18
相关资源
最近更新 更多