如何读取主题的保留消息

How to read retained messages for a Topic

我有一个 Web 应用程序,它向一个主题发布消息,然后有几个 Windows 订阅这些主题的服务,有些有多个实例。如果发布消息时服务 运行 一切正常,但如果不是,则消息将保留在订阅该主题的队列中,但在服务重新启动时不会被读取。

期望的行为-

  1. 当消息发布到主题字符串 MyTopic 时,它被读取 来自 MyTopicQueue 一次。我使用了一些通配符主题,因此每条消息都被发送到多个队列,但是服务的多个实例订阅了相同的主题字符串,每条消息只能由这些实例读取

  2. 如果发布消息时 MyTopic 主题的订阅者不在线,则消息将保留在 MyTopicQueue 中。

  3. 订阅Windows服务时 对一个特定的主题回来在线每条保留的消息是 仅由一个订阅者从 MyTopicQueue 中读取。

我找到了一些关于 MQSUBRQ 和 MQSO_PUBLICATIONS_ON_REQUEST 选项的 [通常用于 IBM] 参差不齐的文档,但我不确定应该如何设置它们。有人可以帮助弄清楚我需要做什么才能获得我想要的行为吗? [除了切换回 RabbitMQ,虽然我更喜欢它但我不能这样做。]

我的选择:

private readonly int _openOptions = MQC.MQSO_CREATE | MQC.MQSO_FAIL_IF_QUIESCING | MQC.MQSO_MANAGED;
private readonly MQGetMessageOptions _messageOptions = new MQGetMessageOptions()

打开主题的代码:

_topic = _queueManager.AccessTopic(_settings.TopicString, null, 
                    MQC.MQTOPIC_OPEN_AS_SUBSCRIPTION, _openOptions);

从主题中读取的代码行(取自循环):

  _topic.Get(mqMessage, _messageOptions);

如果您希望消息在您未连接时累积,您需要通过添加 MQC.MQSO_DURABLE 使订阅持久化。为了能够恢复现有订阅,请在 MQC.MQSO_CREATE.

之外添加 MQC.MQSO_RESUME

注意术语,您所说的保留消息是持久订阅。

保留发布是另一回事,MQ 可以保留关于每个主题的一条最近发布的消息,默认情况下新订阅者将检索这条消息,除非他们使用 MQSO_NEW_PUBLICATIONS_ONLY 跳过接收保留发布。

MQSO_PUBLICATIONS_ON_REQUEST 允许订阅者仅根据请求接收保留的出版物,它不会收到 non-retained 出版物。


如果您希望多个消费者在一个订阅上一起工作,您有两个选择:

  1. 查看 XMS.NET 中的共享订阅者,查看 CLONESUPP 属性。
  2. 针对您要使用的主题创建对队列的一次性持久订阅,然后让您的消费者直接从队列而不是主题中使用。