【问题标题】:Sending rabbitMQ events after transaction commit事务提交后发送rabbitMQ事件
【发布时间】:2021-12-28 17:30:03
【问题描述】:

我在事务中有很大的任务(@Transactional 方法)。在这个任务中,id-s 被收集,然后在事务提交之后必须将它们发送到 RabbitMQ(使用 convertAndSend 方法)。另一端的 RabbitMQ 侦听器获取 id 并更新 DB 中的状态(在事务更改后更新状态很重要,因为只有在它们之后更新的数据才是实际的) 我有下一个问题:

  1. 在事务的最后(提交)中使用钩子的最佳方法是什么?我需要为多个服务类(许多事务方法)创建一个“afterCommit”方法;
  2. 我需要用什么来存储 ID?我曾想过像 ThreadLocal 变量这样的东西,但这不是一个变体 - 如果有并行流,则创建新线程;
  3. 可能有其他解决方案吗?

我已经阅读了有关延迟 RabbitMQ 插件的信息,但它不是我的任务的变体 4 - 他们的时间非常不同。

【问题讨论】:

    标签: spring hibernate rabbitmq spring-transactions


    【解决方案1】:

    查看您问题中的标签,我想您正在使用 spring 框架。

    因此,您可以使用 Spring Events 及其 ApplicationEventPublisher 来发布您的特定 ApplicationEvent 以及所有必要的数据(您的案例中的 id)。

    Spring 允许您将事件侦听器绑定到当前事务的某个阶段。只需在最终将数据发送到 RabbitMQ 的方法上使用 @TransactionalEventListener 注释。可以绑定到不同的事务阶段。使用默认绑定 (AFTER_COMMIT),只有在事务成功完成时才会触发事件。

    Spring Events 上的 Baeldung 文章是查找更多详细信息的好地方。

    【讨论】:

      猜你喜欢
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      • 2016-10-23
      • 1970-01-01
      • 2019-02-09
      相关资源
      最近更新 更多