【问题标题】:Putting MQ message in a queue将 MQ 消息放入队列
【发布时间】:2017-02-02 09:35:02
【问题描述】:

我有一个软件,我通过 C# 软件删除 MQMessages。 首先:我从 MQ 作为 XML 消息字符串接收消息,我进行一些数据处理,然后我准备 XML 文件并将其放入响应队列中。 我将请求消息的相关 ID 设置为与响应消息以及 MessageId 相同,如下所示:

MQMessage _msg = new MQMessage();
_msg.Encoding = 273;
_msg.CharacterSet = 37;
_msg.Format = "MQSTR";
_msg.CorrelationId = message.CorrelationId;
_msg.MessageId = message.MessageId;

其中 message 是我收到的消息(请求消息),_msg 是我放置的响应消息(响应消息)

在 IBM 端,当我收到响应消息时,我检查了相关 ID 和请求消息的相关 ID,但它失败了。

这是我将消息放入队列的方式:

 qmgr.AccessQueue(message.ReplyToQueueName.Trim(), MQC.MQOO_OUTPUT 
 + MQC.MQOO_FAIL_IF_QUIESCING, QueueManagerName, DynamicQueueName, "").Put(_msg);

我的代码中缺少什么?

【问题讨论】:

    标签: c# .net ibm-mq


    【解决方案1】:

    你在做什么?

    我将请求消息的关联 ID 设置为与 响应消息以及 MessageId 如下所示:

    糟糕、非常糟糕的设计,违背了 MQ 消息传递模式。

    (1) 不要设置CCSID和Encoding,你应该使用默认值,让MQ来做。

    (2) 正确的消息传递模式是将响应消息的 CorrelationId 设置为请求消息的 MessageId。这就是你把事情联系在一起的方式。

    您的代码应如下所示:

    MQMessage outMsg = new MQMessage();
    outMsg.Encoding = MQC.MQENC_NATIVE;
    outMsg.CharacterSet = MQC.MQCCSI_DEFAULT;
    outMsg.Format = MQC.MQFMT_STRING;
    outMsg.MessageId = MQC.MQMI_NONE;
    outMsg.CorrelationId = inMsg.MessageId;
    

    这到底是什么?

    qmgr.AccessQueue(message.ReplyToQueueName.Trim(), MQC.MQOO_OUTPUT 
     + MQC.MQOO_FAIL_IF_QUIESCING, QueueManagerName, DynamicQueueName, "").Put(_msg);
    

    天哪。让我数一数你把这件事搞砸的方式。您正在根据“message.ReplyToQueueName”字段中的名称创建一个临时动态队列,然后将消息放入临时动态队列,最后当程序结束(或您实际关闭队列)时,队列被删除(连同您的消息)。

    这是正确的做法:

    MQQueue outQ = null;
    MQPutMessageOptions pmo = new MQPutMessageOptions();
    try
    {
       outQ = qmgr.AccessQueue( inMsg.ReplyToQueueName.Trim(),
                                MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING );
    
       outQ.Put(outMsg, pmo);
    }
    catch (MQException mqe)
    {
       System.Console.WriteLine("MQException CC=" + mqe.CompletionCode + " : RC=" + mqe.ReasonCode);
    }
    finally
    {
       try
       {
          if (outQ != null)
             outQ.Close();  // Close the Queue
       }
       catch (MQException mqe)
       {
          System.Console.WriteLine("MQException CC=" + mqe.CompletionCode + " : RC=" + mqe.ReasonCode);
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-07
      • 2021-06-09
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-21
      • 2021-09-10
      相关资源
      最近更新 更多