1

我将 Jboss 6.1 与 Hibernate 和 HornetQ 一起使用。如果我在我的数据库中操作数据并向队列添加一条消息,该消息依赖于在我不希望在我的数据实际提交到数据库之前处理该消息之前更改的数据。所以为了避免竞争条件,我想让 HornetQ 进入我的容器管理事务,这样消息只会在全局事务也被提交时“提交”到队列中。

这可能吗 ?有什么提示吗?

4

1 回答 1

2

有可能的。您将需要使用 XA 事务,以便获得 2 阶段提交,因此:

  • 使用 XA 数据源连接到数据库。(您使用的是支持 XA 的数据库,对吗?)
  • 使用 XA HornetQ ConnectionFactory。

我发现,验证您实际上正在运行 2PC 事务的最简单方法是:

  1. 在 JMS 和 JDBC 活动都完成但未提交后放置一个调试器断行
  2. 检查应该是com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple实例的事务
  3. 检查_resources字段的内容。

如果事务是 XA 2PC,则该字段(它是一个 Hashtable)将包含 2 个XAResource作为键,一个用于 JMS,另一个用于 JDBC。

我不知道您最熟悉哪种架构,但我认为容器管理的事务无状态会话 EJB 将是最简单的方法。

于 2012-01-20T17:14:18.620 回答