0

我正在使用事务来读取和确认 IBM 队列上的消息,我想知道当多个消费者实例从同一个队列中读取时,创建的会话是否会全局connection.CreateSession(true, AcknowledgeMode.SessionTransacted)锁定消息?

背景:我编写了一个小型 .NET Core 后台服务,它使用 IBM XMS 获取队列的消息。此服务的实例将托管在两个不同的服务器上(负载平衡),每个服务将连接到同一个队列。我担心的是,由于不同服务器上的两个不同消费者正在从同一个队列中读取,他们可能会尝试使用相同的消息。

我最近遇到了SimpleXAConsumer示例,其中使用了CommittableTransaction()对象而不是会话事务。该文件指出:

“当使用 XA 事务时,事务控制是通过分布式事务协调器 (DTC)全局事务进行的,而不是通过 XMS 会话。”

...这让我相信 XMS 会话事务不是全局的,除非使用 CommittableTransaction() 对象。

如果有人可以确认,那就太好了:

  1. 如果必须使用 CommittableTransaction() 来创建全局事务。
  2. 如果一个全局事务锁定了一条消息,以便没有其他消费者可以使用它。
4

1 回答 1

2

如果应用程序在事务会话中收到消息,则该消息对其他应用程序将不可见(因此无法获取)。如果应用程序使用方法提交事务session.commit(),则消息将从队列中永久删除。另一方面,如果消息被应用程序回滚,则该消息将可供其他消费者(或同一消费者)使用。

还有一点需要注意:如果第一个参数为真,则方法中的AcknowledgeMode参数connection.createSession()无效 - 意味着正在创建事务会话。使用事务处理会话时,应用程序必须使用提交或回滚方法。

于 2021-11-01T15:25:08.690 回答