【问题标题】:C# IBM MQ client sending my own messageIdC# IBM MQ 客户端发送我自己的 messageId
【发布时间】:2017-03-15 03:57:00
【问题描述】:

我正在发送一条 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。最佳做法是将请求消息 ID 复制到响应相关 ID

标签: c# ibm-mq


【解决方案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 成为唯一的,并在正文中解释了如何通过放置消息的应用程序来控制它。

【讨论】:

    猜你喜欢
    • 2020-05-14
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 2022-11-08
    • 2013-03-28
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    相关资源
    最近更新 更多