如果数据库事务使用 Spring AMQP 成功,则仅将消息发布到 RabbitMQ
Only publish messages to RabbitMQ if database transaction is successful using Spring AMQP
假设我有一个看起来像这样的方法:
@Transactional
public void x(Entity entity) {
// do something
myRepository.save(entity);
rabbitTemplate.convertAndSend(new Event1());
rabbitTemplate.convertAndSend(new Event2());
}
myRepository
正在使用 org.springframework.orm.jpa.JpaTransactionManager
类型的事务管理器。我想要做的是确保 Event1
和 Event2
的发送仅在 myRepository.save(entity)
成功时发生。 RabbitTransactionManager help here or do I have to implement this myself (for example using a TransactionSynchronizationManager)?
什么叫 x()
?
如果是RabbitMQ 监听器容器线程,在接收到来自rabbit 的一些消息后,将JpaTransactionManager 添加到容器中,rabbit 事务将为您同步。
如果它是某个任意线程,那么您需要在调用 x 之前启动一个 rabbit 事务,然后再提交它。
无论哪种情况,您的兔子频道都需要是事务性的。
假设我有一个看起来像这样的方法:
@Transactional
public void x(Entity entity) {
// do something
myRepository.save(entity);
rabbitTemplate.convertAndSend(new Event1());
rabbitTemplate.convertAndSend(new Event2());
}
myRepository
正在使用 org.springframework.orm.jpa.JpaTransactionManager
类型的事务管理器。我想要做的是确保 Event1
和 Event2
的发送仅在 myRepository.save(entity)
成功时发生。 RabbitTransactionManager help here or do I have to implement this myself (for example using a TransactionSynchronizationManager)?
什么叫 x()
?
如果是RabbitMQ 监听器容器线程,在接收到来自rabbit 的一些消息后,将JpaTransactionManager 添加到容器中,rabbit 事务将为您同步。
如果它是某个任意线程,那么您需要在调用 x 之前启动一个 rabbit 事务,然后再提交它。
无论哪种情况,您的兔子频道都需要是事务性的。