将MQ消息放入队列中

本文关键字:队列 MQ 消息 | 更新日期: 2023-09-27 18:04:23

我有一个通过c#软件放置mqmessage的软件。首先:我收到来自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端,当我收到响应消息时,我用请求消息的correlationId检查相关性Id,结果失败。

下面是我将消息放入队列的方法:

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

我的代码中缺少什么?

将MQ消息放入队列中

你到底在干什么?

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

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

(1)不要设置CCSID和Encoding,您应该使用默认值并让MQ完成工作。

正确的消息传递模式是将响应消息的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);

OMG。让我数一数你把事情搞砸了多少次。您正在根据消息中的名称创建临时动态队列。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);
   }
}