我在 JTA、两阶段提交、JMS 和 JDBC 事务中苦苦挣扎。这个想法是(简而言之)
- 在队列中接收消息
- 执行一些数据库操作
- 确认消息,当数据库操作成功时
所以我得到了XAQueueConnectionFactory
,创建了XAQueueSession
,从会话中创建了一个接收器并设置了一个消息监听器。
在侦听器内部,在onMessage
方法中,我开始我的用户事务,执行 jdbc 内容并提交事务或执行回滚,如果出现问题。现在我预计(又名“希望”)当用户事务提交时消息会被确认。
但这并没有发生,消息仍在队列中,并且一次又一次地重新传递。
我错过了什么?我仔细检查了会话,确认模式确实是“ SESSION_TRANSACTED
”并getTransacted
返回 true。
我没有 Java EE 容器,没有 spring,没有消息驱动 bean。我使用独立的 JTA bitronix。