由EJB事务管理器管理的Rabbit AMQPTemplate消息发送

时间:2014-11-24 14:10:51

标签: ejb spring-amqp

我正在使用spring amqp在EJB(无状态会话bean)中的Rabbit队列上放置消息。

当抛出EJB容器中的异常时,数据更新被回滚,无论如何让EJB容器以类似的方式管理消息的发送,以便它只在EJB时提交到队列完成时没有抛出异常?

2 个答案:

答案 0 :(得分:0)

最好的方法是:

  1. 完全摆脱EJB

  2. 使用Spring TX Manager

  3. RabbitTemplate会自动为您进行TX同步。

  4. EJB发送同步(提交或回滚)的问题RabbitTemplate没有看到当前的TX,因为它不是由Spring管理的。

    如果可以将EJB作为Spring bean,您将能够为EJB容器事务提供JtaTransactionManager并使用@Transactional标记EJB方法。但是在这种情况下,EJB并没有出现,因为我们在这里使用Spring。

答案 1 :(得分:0)

RabbitMQ没有支持XA的驱动程序,所以不能,它不能由容器管理,你可以做的最好的事情就是在模板上设置channelTransacted并使用{{设置EJB代码的范围1}}方法......

doInRabbit()

然后,如果抛出异常,则将回滚这两个事务。

但是,如果EJB提交失败,则兔子发布将已经提交并且不会回滚,因此您应该计划处理(罕见)重复项。