0

Info :: 我有一个带有 XA 事务的 DefaultMessageListener 实现。我使用了 MessageListener 实现。

场景::我的 XA 事务位于 DB 和 JMS Q Publish 之间。如果其中任何一个出现“数据错误”,我需要将源消息“移动”到不同的 Q 并继续处理其余消息。

问题:: 现在,如果我的 DB 事务因 DataIntegrity 错误(主键违规)而失败,那么 XA 事务将在 Container 处回滚(而不是在 MessageListener 实现中)。因此,原始消息回滚到 Q,消息侦听器无限期地被此消息卡住 - 接收和失败处理。

如何检查某些异常 - 并在容器中以不同方式处理它们,以便我可以继续处理其余消息。

银丝

4

1 回答 1

0

嗯,这就是 XA 事务的重点——要么全部提交,要么什么都不做。

如果您希望数据库事务与 Jms 事务没有任何关系,则需要

@Transactional(propagation=Propagation.REQUIRES_NEW) 

在侦听器上游的某些方法上。在侦听器中捕获并处理异常,JMS 事务将提交。

在这种情况下(除非涉及其他资源),您确实不需要 XA - 但您确实需要处理重复消息的(小)可能性 - 如果 DB 事务提交而 JMS 事务由于某种原因没有提交.

http://www.javaworld.com/javaworld/jw-01-2009/jw-01-spring-transactions.html

于 2013-03-24T20:51:37.910 回答