在Jboss中使用HornetQ时避免竞争条件

时间:2012-01-20 16:04:48

标签: java-ee transactions jms jboss6.x hornetq

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

这可能吗?任何提示?

1 个答案:

答案 0 :(得分:2)

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

  • 使用XA DataSource连接数据库。 (您正在使用支持XA的数据库,对吗?)
  • 使用XA HornetQ ConnectionFactory。

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

  1. 在JMS和JDBC活动完成但未提交
  2. 之后放置调试器中断行
  3. 检查应该是com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple
  4. 实例的交易
  5. 检查_resources字段的内容。
  6. 如果事务是XA 2PC,那个字段(Hashtable)将包含2个XAResource作为键,一个用于JMS,另一个用于JDBC。

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