【发布时间】:2017-10-13 01:32:52
【问题描述】:
我在这里试图理解一些事情。我的要求是我想将记录存储在数据库中并想将消息发送到队列,然后如果它抛出一些异常我不想发送消息并且不想提交数据库事务,那么让我们用相同的方法说。 现在我想到了使用 spring 事务,但是由于两个不同的资源,想到了使用 JTA 使用一些 atomikos 来同步资源 - 但我再次阅读 RMQ 不支持 2PC 或 XA 等。 无论如何,我继续尝试首先尝试不添加 atomikos,我所做的只是确保我的频道交易和 @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();
}
我在上面的例子中使用了 postgres 依赖项,使用 spring boot 1.5.7
【问题讨论】:
标签: spring-transactions spring-amqp spring-rabbit distributed-transactions