2011-06-10 94 views
4

我有一个奇怪的现象,即在数据库提交实际发生之前似乎发送了jms消息。是否有要求在提交结束时发送jms消息?

可以说我有一个服务器操作foo(),当它完成时向客户端发送消息。客户端然后从服务器加载更改的数据。现在看来,jms消息是在提交实际完成之前发送的,所以客户端仍然获取旧数据,因为它的请求仍然在原始提交结束之前。

整个服务器操作肯定是事务性的,因为如果抛出异常,jms事件是而不是发送。

jms规范中是否有任何要求首先必须发生所有的数据库提交,然后发送jms消息,还是发送到实现按顺序发生?

我们正在讨论jboss 6.0.0.Final中的默认hornetq实现。

更新:

看来我有同样的问题,因为这些家伙:http://techstack.com/forum/websphere/34434-order-commits-xa-transaction.html

更新2:

有同样问题的其他用户http://community.jboss.org/message/114459

+0

我不明白你的问题的某些部分。你能提供更多关于如何调用foo()的上下文吗?如果这种情况发生在MDB中,那么这很重要,而不是任何其他没有设置事务性需求的代码。顺便说一下,数据库提交与JMS消息的发送是相切的;发送取决于事务管理器的存在。 – 2011-06-10 13:04:14

+0

该链接现在更清晰。你能否检查你是否遵循[本文档中指定的编程范例](http://www.odi.ch/prog/jms-tx.php)?虽然它适用于JBoss 4,但大多数要点都是相关的,特别是具有'READ_COMMITTED'的数据库事务隔离级别,以及使用'java:/ JmsXA'来定位连接工厂。 – 2011-06-10 13:26:39

+0

@ vineet-reynolds,是的,所有的交易行为都应该像它应该的那样。我实际上设法将我的问题缩小为一个很小的例子,我会看到我可以用它更新我的问题(它仍然有点难以实现) – Mauli 2011-06-27 16:18:37

回答

0

JMS操作是事务性的,这就是jms消息在提交时被传递的原因。如果您想查看已提交的数据,请将事务属性REQUIRES_NEW的db操作放入另一个EJB方法。

+0

这不是我想要的,JMS消息**必须是**在同一笔交易中。看起来好像JMS消息被发送到了早期。 – Mauli 2011-06-10 13:07:55

0

你只需要确保你的连接工厂是同一个XA事务的一部分。

您必须在EJB上设置REQUIRES_NEW,因为Gursel Koca在另一篇文章中这么说。

更简单的将使用JCA连接工厂(通常在java:// JmsXA)