2013-12-12 154 views
3

Iv'e在互联网上听到rabbitMQ不支持交易。现在Spring rabbitMQ - 交易和交易管理器

,这么说,Spring框架为我们提供了一个兔子事务管理器:

这里是其定义的一个片段:

<bean id="rabbitTransactionManager" 
    class="org.springframework.amqp.rabbit.transaction.RabbitTransactionManager"> 
    <property name="connectionFactory" ref="connectionFactory" /> 
</bean> 

所以我的问题是:

1)不使用事务管理器的方法使用@transactional注释实际上保证事务效果? 2)当兔子是非跨国的时,春天如何实现交易?

+2

请参阅http://www.rabbitmq.com/semantics.html和http://docs.spring.io/spring-amqp/docs/1.2.0.RELEASE/reference/html/amqp.html#d4e602。 –

+1

正确,但请记住,兔子交易存在限制,如下文所述:http://www.rabbitmq.com/semantics.html但Spring AMQP将事务通道绑定到正常的Spring事务语义(如发布到侦听器容器线程上的兔子模板使用相同的通道/事务)。此外,Martin关于nacked消息到队列后面的引用中的注释已经过时;该行为在RabbitMQ中已更改,回滚消息现在位于队列的前端。我会修复文档。 –

+1

更正“回滚信息”应为“拒绝信息”;没有消息回滚,它是将消息放回到队列(现在的前面)的消息拒绝。 –

回答

3

兔子确实支持本地交易。例如,在交易中,如果消费者中发生了某些情况,并且收到的消息无法处理,则该消息将发回给代理并且不会消耗。

与其他代理(如大多数基于JMS的代理)不同的是,Rabbit不支持分布式事务(XA转换)。这意味着在通过Rabbit发送消息并在数据库中保存一些数据时,您不能进行相同的事务。