【发布时间】:2013-06-30 03:53:00
【问题描述】:
为了简化我的问题,我有
App1 与 @Transactionnal 方法 createUser():
- 在数据库中插入新用户
- 在 RabbitMQ 中添加异步消息,以便用户收到通知邮件
- (可能有一些额外的代码,但不多)
带有 RabbitMQ 消息消费者的 App2
- 实时使用邮件队列中的消息
- 读取数据库中的邮件数据
- 发送邮件
问题在于,有时,App2 甚至在 App1 上提交事务之前尝试使用 RabbitMQ 消息。这意味着 App2 无法读取数据库中的邮件数据,因为尚未创建用户。
一些解决方案可能是:
- 在 App2 上使用 READ_UNCOMMITED 隔离级别
- 在 RabbitMQ 消息传递中添加一些延迟(或消费者上的一些 RetryTemplate)
- 改变我们发送电子邮件的方式...
我看到 Spring 中有一个 RabbitTransactionManager,但我不明白它应该如何工作。事务处理的内部结构似乎总是有点难以理解,文档也没有太大帮助。
有没有办法做这样的事情?
- 在 @Transactionnal 方法中向 RabbitMQ 队列添加消息
- 事务结束时,消息提交到队列,更改提交到数据库
- 使得在DB事务结束前无法消费消息
怎么样?例如,如果我发送同步 RabbitMQ 消息而不是异步消息,会发生什么?它会阻塞等待响应的线程吗? 因为我们确实为不同的用例发送同步和异步消息。
【问题讨论】:
-
两个应用程序都使用来自同一个队列的消息,我说得对吗?
-
否,App1 将消息放入队列,App2 使用该队列中的消息
-
您是否设法以某种方式解决了这个问题?我也面临同样的问题。
-
同样的问题,有人解决了吗?
标签: spring transactions rabbitmq distributed-transactions