跳到主要内容

在XA事务中消费消息

要消费XA事务分支中的消息,客户端必须在XA会话中创建一个消息消费者,以便接收持久和非持久消息。

要在XA会话中创建一个消息消费者,调用XASession.createConsumer(...)方法,并传入一个队列或主题目标。有关创建消息消费者及其操作的更多信息,请参阅创建消息消费者。

当XA会话中的消息消费者绑定到一个队列(无论是独占的还是非独占的)时,非XA会话中的消息消费者不允许随后绑定到该队列。此外,如果非XA会话中的消息消费者绑定到一个非独占队列,XA会话中的消息消费者不能随后绑定到该队列。这些限制防止了在XA事务回滚时,向非XA会话中的消费者发送顺序错误的消息。

在XA会话中接收的消息只有在调用XAResource.end(...)后才会被分配到事务分支(参见结束事务)。最多可以将256条消息(包括发布者和/或订阅者的消息)分配给一个事务分支。如果超过此限制,将发生回滚,并抛出一个XAException

与在非事务会话中接收的消息不同,在XA会话中接收的消息只有在事务分支成功执行XAResource.commit(...)时才会被确认,并随后从事件代理中移除。因此,调用Message.acknowledge()对事务分支没有影响。

在XA会话中创建的消息消费者只能在该XA会话中的事务分支提交时消费消息,它不能在该XA会话之外消费消息。

如果在XA Prepare调用之后但在XA Commit之前,由于以下原因从消息暂存区中移除了要消费的事务分支中的消息,它们仍然可以成功提交:

  • 消息通过XA Prepare操作从事件代理中移除(即,消息从暂存区中删除)。
  • 消息的TTL已过期。注意,无论过期的消息是否被移动到死信队列(DMQ),提交都会成功。有关DMQ的信息,请参阅死信队列资格。