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

时间:2016-11-01 22:44:36

标签: c# ibm-mq

我正在发送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

1 个答案:

答案 0 :(得分:1)

是的,代码可能会明确设置消息ID,但您的代码似乎不会重用MQMD结构,而这通常就是这种情况。如果负载测试工具多次重放相同的消息并保留消息ID,则更有可能基于您的描述和代码。

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

请参阅:
MQMessage.NET class,其中显示“使用默认消息描述符信息创建MQMessage对象...”当然,默认MQMD会导致QMgr生成消息ID。

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