我正在尝试让 MSMQ 5 在我的两台 Windows Server 2008 R2 虚拟机上运行。我可以发送到本地和远程专用队列,并且可以从本地专用队列中读取。我无法从远程专用队列中读取数据。
我读过很多建议,尤其是 John Breakwell 在MSMQ Issue Reading Remote PrivateQueues (again)中总结的建议。
我已经做过的事情:
发送代码片段是:
MessageQueue queue = new MessageQueue(queueName, false, false, QueueAccessMode.Send);
Message msg = new Message("Blah");
msg.UseDeadLetterQueue = true;
msg.UseJournalQueue = true;
queue.Send(msg, MessageQueueTransactionType.Automatic);
queue.Close();
Run Code Online (Sandbox Code Playgroud)
接收代码片段为:
queueName = String.Format("FormatName:DIRECT=OS:{0}\\private$\\{1}",host,id);
queue = new MessageQueue(queueName, QueueAccessMode.Receive);
queue.ReceiveCompleted += new ReceiveCompletedEventHandler(receive);
queue.BeginReceive();
Run Code Online (Sandbox Code Playgroud)
...
public void receive(object sender, ReceiveCompletedEventArgs e)
{
queue.EndReceive(e.AsyncResult);
Console.WriteLine("Message received");
queue.BeginReceive();
}
Run Code Online (Sandbox Code Playgroud)
我的队列名称最终为FormatName:DIRECT=OS:server2\private$\TestQueue
当我在队列上调用 beginReceive() 时,我得到
Exception: System.Messaging.MessageQueueException (0x80004005)
at System.Messaging.MessageQueue.MQCacheableInfo.get_ReadHandle()
at System.Messaging.MessageQueue.ReceiveAsync(TimeSpan timeout, CursorHandle cursorHandle, Int32 action, AsyncCallback callback, Object stateObject)
at System.Messaging.MessageQueue.BeginReceive()
Run Code Online (Sandbox Code Playgroud)
我在 Server1 上使用 Wireshark 来查看网络流量。在没有发布所有细节的情况下,它似乎经历了以下阶段。(Server1 正在尝试从 Server2 上的队列中读取数据。)
我尝试启用“事件查看器”>“应用程序和服务日志”>“Microsoft”>“Windows”>“MSMQ”>“End2End”。它显示正在发送的消息,但没有表明尝试接收失败的原因。我怎样才能进一步调试这个?
该问题与域有关。Server1 和 Server2 是开发域的一部分。我的登录帐户是公司域的一部分。开发域对公司域的信任足以让我登录、成为管理员成员、安装功能等。但似乎没有足够的信任来读取远程队列。
我通过研究公共队列发现了这一点。如果我在读取远程专用队列时遇到问题,也许我应该通过尝试公共队列来获取更多数据。安装适当的目录集成功能后,我能够创建公共队列,但在公共队列列表中看不到它。尝试刷新公共队列列表给了我这个错误:
并非所有公共队列都可以显示。只能显示本地缓存的公共队列。错误:在 Active Directory 中找不到该对象。
Google向我指出了 John Breakwell 对类似问题的回答,这表明信任关系不适用于跨消息传递协议。