2016-01-20 90 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,你應該檢查更多的信息過載的形式。