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

发布于 2024-12-27 23:48:40 字数 197 浏览 0 评论 0原文

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

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

I'm using Jboss 6.1 together with Hibernate and HornetQ.
If I manipulate Data in my Database and add a message to the Queue that relies on the data changed just before I don't want that message to be processed before my data has been actually committed to the DB.
So in order to avoid a race condition I'd like to get HornetQ into my Container Managed Transaction so the message would only be "committed" to the queue when the global Transaction is also committed.

Is this possible ? Any hints ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

飘落散花 2025-01-03 23:48:40

这是可能的。
您将需要使用 XA 事务,以便获得两阶段提交:

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

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

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

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

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

It is possible.
You will need to use an XA transaction so you get a 2 phase commit so:

  • Use an XA DataSource for the connections to the database. (You are using an XA capable DB, right ?)
  • Use an XA HornetQ ConnectionFactory.

The easiest way, I have found, to validate that you are in fact running a 2PC transaction is:

  1. Place a debugger break line after both the JMS and JDBC activity is complete, but not committed
  2. Examine the transaction which should be an instance of com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple
  3. Examine the contents of the _resources field.

If the transaction is an XA 2PC, that field (which is a Hashtable) will contain 2 XAResources as keys, one for JMS and the other for JDBC.

I don't know which architecture you're most familiar with, but I would think that a container managed transactional stateless session EJB would be the easiest way to do this.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文