Spring我需要使用EventListener而不是Async吗?

问题描述

我正在使用使用Spring的ApplicationEventPublisher发布消息的应用程序。我们将具有对rdbms进行一些复杂的读取/更新功能,然后将其发布以像向用户发送电子邮件甚至为其他微服务发布sqs消息一样起作用的功能

ApplicationEventPublisher eventPublisher;
UpdateEvent event = UpdateEvent.builder().eventSource("SomeUpdate")
                    .scenarioId(scenarioId).build();
eventPublisher.publishEvent(event);

一个听众:

public interface LocalMessageHandlingAsyncService {

    @TransactionalEventListener
    void publishUpdateEvent(UpdateEvent mediaPlanUpdateEvent);

由于某些事件将针对刚刚处理的数据对数据库进行读取,因此我们使用@TransactionalEventListener以确保我们处理最新提交的数据。当我查看这种类型的模式时,我想知道与仅调用一个单独的异步方法相比,它的优点是什么?

使用异步方法,我们不必担心将对象序列化为json或创建单独的Event对象进行管理。我们仍然需要担心未完成的交易,但是我相信使用TransactionSynchronizationManager是可以解决的。

据我所知,与使用异步方法相比,使用事件的优势在于应用程序的多个区域可能希望侦听该事件。但是,这与我们的用例不匹配,因为我们只有一个消费者。

解决方法

正如您已经提到的,只有一个消费者,这种设计模式并没有带来太多好处。

不过,我会提出其他建议:Spring Integration

使用Spring Integration,您可以创建管道并实际集成诸如向用户发送电子邮件以及将消息发送到SQS本地发布到其他微服务之类的任务。这使您能够:

  1. 在单个应用程序中的服务任务之间转换和处理消息
  2. 如果需要,请使用消息代理(例如RabbitMQ)来处理1.中相同消息向分布式环境的分发(即3.中的服务可能在另一台机器上运行,等等。)可以发送并忘记)
  3. 在一项服务任务中,您实际上可以发送电子邮件等。