将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);
我的代码中缺少什么?
你到底在干什么?
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);
}
}