Info ::我有一个带XA事务的DefaultMessageListener实现。我使用了MessageListener实现。
情景:: 我的XA事务是在DB和JMS Q Publish之间进行的。如果出现"数据错误"在其中任何一个中,我需要"移动"源消息到另一个Q并继续处理其余的消息。
问题:: 现在,如果我的数据库事务因DataIntegrity错误(主键冲突)而失败,则XA事务将回滚到Container(而不是在MessageListener实现中)。因此原始消息回滚到Q,并且消息监听器无限期地接收此消息 - 接收和失败处理。
如何检查一些异常 - 并在容器中以不同方式处理它们,以便我可以继续使用其余的消息。
ginz
答案 0 :(得分:0)
嗯,这就是XA事务的重点 - 无论是提交还是什么都没有。
如果您希望数据库事务对Jms事务没有任何影响,则需要
@Transactional(propagation=Propagation.REQUIRES_NEW)
在侦听器上游的某个方法上。在侦听器中捕获并处理异常,JMS事务将提交。
在这种情况下(除非涉及其他资源),您实际上不需要XA - 但您确实需要处理重复消息的(小)可能性 - 如果数据库事务提交而JMS事务没有,出于某种原因。
请参阅http://www.javaworld.com/javaworld/jw-01-2009/jw-01-spring-transactions.html