在 Jboss 中使用 HornetQ 时避免竞争条件
我将 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是可能的。
您将需要使用 XA 事务,以便获得两阶段提交:
我发现,验证您实际上正在运行 2PC 事务的最简单方法是:
如果事务是 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:
The easiest way, I have found, to validate that you are in fact running a 2PC transaction is:
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.