我有一个软件,我通过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);
我的代码中缺少什么?
答案 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);
}
}