【发布时间】:2020-08-15 19:32:10
【问题描述】:
我正在使用一个使用 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 或创建单独的事件对象来管理。我们仍然需要担心未处理的交易,但我相信,使用 TransactionSynchronizationManager 可以解决这个问题。
据我所知,使用事件而不是调用异步方法的优势在于,应用程序的多个区域可能想要监听事件。然而,这与我们的用例不匹配,因为我们只有一个消费者。
【问题讨论】:
标签: spring-boot events spring-transactions spring-async