MSMQ:如何通过确认消息找出原始消息?

时间:2016-01-20 09:24:58

标签: c# .net msmq

我通过指定确认队列发送消息,以便我可以判断消息是否已到达目标队列。 代码如下:

 string queuePath = @"FormatName:DIRECT=TCP:127.0.0.1\PRIVATE$\testqueue";
                    string ackPath = @".\private$\ack";
                    MessageQueue msmq = new MessageQueue(queuePath,QueueAccessMode.SendAndReceive);
                    tran.Begin();
                    Message msg = new Message();
                    msg.UseAuthentication = false;
                    msg.Recoverable = true;
                    msg.Body = "HelloWorld";
                    msg.AcknowledgeType = AcknowledgeTypes.FullReachQueue;
                    msg.AdministrationQueue = new MessageQueue(ackPath, QueueAccessMode.ReceiveAndAdmin);
                    msmq.Send(msg, tran);
                    tran.Commit();

一切顺利,我可以在发出消息后在队列“ack”中找到确认消息。 但我无法弄清楚确认信息和原始信息之间的关系。

所以我的问题是:如何将确认消息映射到原始消息?

1 个答案:

答案 0 :(得分:1)

您需要使用System.Messaging.Message.CorrelationId属性。

  

获取或设置确认,报告,使用的消息标识符,   和响应消息以引用原始消息。

来源:https://msdn.microsoft.com/en-us/library/system.messaging.message.correlationid(v=vs.110).aspx

var msgToSend = new Message();
// ... set message props including admin queue
var targetQueue = new MessageQueue(...);
targetQueue.Send(msgToSend);

// Read acknowledgment
var adminQueue = new MessageQueue(ackPath);
var msgAck = adminQueue.ReceiveByCorrelationId(msgToSend.Id, new TimeSpan(0, 0, 2));
if (msgAck)
{
    return msgAck.Acknowledgment;
}

还有PeekByCorrelationId方法或ReceiveByCorrelationId的重载形式,您应该检查以获取更多信息。