我通过指定确认队列发送消息,以便我可以判断消息是否已到达目标队列。 代码如下:
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”中找到确认消息。 但我无法弄清楚确认信息和原始信息之间的关系。
所以我的问题是:如何将确认消息映射到原始消息?
答案 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
的重载形式,您应该检查以获取更多信息。