我正在使用spring amqp在EJB(无状态会话bean)中的Rabbit队列上放置消息。
当抛出EJB容器中的异常时,数据更新被回滚,无论如何让EJB容器以类似的方式管理消息的发送,以便它只在EJB时提交到队列完成时没有抛出异常?
答案 0 :(得分:0)
最好的方法是:
完全摆脱EJB
使用Spring TX Manager
RabbitTemplate
会自动为您进行TX同步。
EJB发送同步(提交或回滚)的问题RabbitTemplate
没有看到当前的TX,因为它不是由Spring管理的。
如果可以将EJB作为Spring bean,您将能够为EJB容器事务提供JtaTransactionManager
并使用@Transactional
标记EJB方法。但是在这种情况下,EJB并没有出现,因为我们在这里使用Spring。
答案 1 :(得分:0)
RabbitMQ没有支持XA的驱动程序,所以不能,它不能由容器管理,你可以做的最好的事情就是在模板上设置channelTransacted
并使用{{设置EJB代码的范围1}}方法......
doInRabbit()
然后,如果抛出异常,则将回滚这两个事务。
但是,如果EJB提交失败,则兔子发布将已经提交并且不会回滚,因此您应该计划处理(罕见)重复项。