spring-transactions - 事务处理 Rabbit MQ 和 Spring AMQP

标签 spring-transactions spring-amqp spring-rabbit distributed-transactions

我想在这里了解一些事情。我的要求是我想将记录存储在数据库中并想将消息发送到队列,然后如果它抛出一些异常我不想发送消息也不想提交数据库事务,那么让我们用相同的方法说。 现在我想到了使用 spring 事务,但是由于两种不同的资源,我想到了使用 JTA 使用一些 atomikos 来同步资源——但我再次阅读 RMQ 不支持 2PC 或 XA 等。 无论如何,我继续并首先尝试不添加 atomikos,我所做的只是确保我的 channel 已处理并且 @Transaction 注释已处理,请参见下面的示例代码 - 我没有在 pom 中添加任何特殊内容。

现在我的问题是它是如何工作的,它与 2PC 有何不同 - 方法可能出现什么问题以及使用这种方法在什么情况下会破坏最终的一致性。令人惊讶的是,为什么我不必使用第三方 jta。如果这一切都很好 - 在我看来,当我们使用 rmq 和 db 使用 spring goodies 时,这似乎是最终的一致性保证!对于微服务:)

如果这不是好的解决方案,还有什么替代方案 - 如果可能的话,我想避免工作进程等,以实现最终的一致性。

@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
    RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
    rabbitTemplate.setChannelTransacted(true);
    return rabbitTemplate;
}

@GetMapping
@Transactional
public void sampleEndpoint(@RequestParam boolean throwException){
    Customer a=new Customer();
    a.setCustomerName("XYZ");
    customerRepository.save(a);
    rabbitTemplate.convertAndSend("txtest","Test");
    if(throwException)
    throw new RuntimeException();
} 

我使用 spring boot 1.5.7 在上面的例子中使用了 postgres 依赖

最佳答案

我建议你阅读 Dave Syer's article: Distributed transactions in Spring, with and without XA .

您需要在数据库事务之前启动 Rabbit 事务,以便 Rabbit 事务与数据库事务同步并在 DB tx 之后很快提交,如果 DB tx 回滚则回滚。

DB 交易提交成功但 Rabbit 交易回滚的可能性很小。这在文章中被称为“Best Effort 1PC”。您需要处理重复消息的可能性很小。

您没有显示所有配置,但看起来您的 Rabbit tx 将在数据库之前提交,这可能不是您想要的。

关于spring-transactions - 事务处理 Rabbit MQ 和 Spring AMQP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46721195/

相关文章:

java - doGetTransaction() 的实现

spring - 当 MessageListener 抛出异常时,RabbitMQ 监听器停止监听消息

rabbitmq - @RabbitListener 用于多个类中的同一个队列

java - 如果出现严重的全局错误,请停止使用 RabbitMQ 消息

java - 我把 noRollbackFor 放在哪里有关系吗?

java - Spring事务管理在出现错误时不起作用

java - 抛出异常后回滚事务

spring - 如何在 Spring AMQP 中使用拦截器

java - Spring Integration AMQP - 消息偶尔未确认,需要超时吗?

java - 关机信号异常 : connection error RabbitMQ on STS4