将MQ消息放入队列

时间:2015-07-24 12:27:22

标签: c# .net ibm-mq

我有一个软件,我通过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是我收到的消息(Request message),_msg是我放的响应消息(Response message)

在IBM方面,当我收到响应消息时,我使用请求消息的correlationId检查相关Id,但它失败了。

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

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

我的代码中缺少什么?

1 个答案:

答案 0 :(得分:0)

你在做什么?

  

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

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

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

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

您的代码应如下所示:

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。让我算一下你搞砸了的方法。您正在根据' 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);
   }
}