2016-01-20 93 views
1

我被指定确认队列发送消息,这样我可以找出该消息是否已经达到目标队列。 的代码如下: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

您需要使用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,你应该检查更多的信息过载的形式。