我正在发送MQ消息,并按预期返回了messageID和correlationID,并且可以捕获使用MQ服务器返回的messageID发送的特定消息的响应。

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

我不是队列管理器的所有者,管理员的响应是“创建了您自己的消息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 MQMessage()类构造函数执行期间复制消息ID的错误的可能性要大得多。

请参见:
MQMessage.NET class表示“正在创建具有默认消息描述符信息的MQMessage对象...”当然,默认MQMD会导致QMgr生成消息ID。

MQMD - MsgId (MQBYTE24)在底部的注释中解释了如何使MsgID唯一,以及在主体中如何通过放置消息的应用程序来控制它。

关于c# - C#IBM MQ客户端发送我自己的messageId,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40369767/

10-11 20:36