C# IBM MQ 客户端发送我自己的 messageId

C# IBM MQ client sending my own messageId

我正在发送一条 MQ 消息,并按预期在 return 中获取消息 ID 和 correlationID,并且我可以捕获来自我使用消息 ID return 发送的特定消息的响应MQ 服务器。

我将我的应用程序放入负载测试工具中,我发现在某些情况下,队列管理器 return 编辑的消息 ID 与之前的消息相同,在这些情况下,应用程序无法读取具有相同 messageID 的下一条消息。

我不是队列管理器的所有者,管理员的回复是 "created your own message id"。

我能做到吗? messageID 是否需要有特定的格式?

这是我的代码:

            message = strInputMsg;
            queueMessage = new MQMessage();
            queueMessage.WriteString(message);
            queueMessage.Format = MQC.MQFMT_STRING;
            queueMessage.Expiry = timeOutExpiry;
            queueMessage.ReplyToQueueName = QueueNameExpiry;
            queuePutMessageOptions = new MQPutMessageOptions();
            queuePutMessageOptions.Options =       MQC.MQRO_COPY_MSG_ID_TO_CORREL_ID;
            queue.Put(queueMessage, queuePutMessageOptions);
            bytReturn = queueMessage.MessageId;

那么我可以在发送消息之前将 MessageID 属性 设置为我自己的消息 ID 值吗,如下所示?

queueMessage.MessageId = myOwnMessageId

是的,代码可能明确设置了消息 ID,但您的代码似乎没有重用 MQMD 结构,这通常是这样发生的。如果负载测试工具多次重播相同的消息并在这样做时保留消息 ID,则更有可能基于您的描述和代码。

如果允许 MQ 设置消息 ID,它保证它在它生成的 ID 的队列管理器中是唯一的。它不保证跨多个队列管理器的 GUID,但会尝试通过在消息 ID 中包含 QMgr 名称的 12 个字符来确保不会发生冲突。因此,尽管我们没有关于正在使用哪个负载测试工具以及它是否使用消息重放的信息,但这种可能性似乎比 MQ 有一个在 .Net 执行期间复制消息 ID 的错误更有可能 MQMessage() class构造函数。

请看:
MQMessage.NET class 即 "Creates an MQMessage object with default message descriptor information..." 当然,默认的 MQMD 会导致 QMgr 生成消息 ID。

MQMD - MsgId (MQBYTE24) 在底部的注释中解释了如何使 MsgID 成为唯一的以及在正文中它如何由放置消息的应用程序控制。