我必须创建一个消息队列管理同一域中两个服务器之间的消息传递机制,发送服务器(MS Server 2012)和接收服务器(微软服务器 2008 R2)。
我创建了一个私有的事务队列接收服务器 .\private$\receiver
,我授予系统和管理员接收(和查看)消息的权限。
然后我创建了一个客户端应用程序,使用以下代码创建并将消息转发到队列:
MessageQueue queue = new queue("FormatName:Direct=OS:ReceiverServer\private$\receiver");
Message message = new Message();
message.Body = "myMessage";
using (MessageQueueTransaction tx = new MessageQueueTransaction())
{
tx.Begin();
queue.Send(message, "myLabel", tx);
tx.Commit();
}
在部署应用程序之前,我在我的机器(Windows 7)上进行了测试,它正确地创建了一个带有 和 的传出队列Direct=OS:ReceiverServer\private$\receiver
。State:Connected
消息Connection History:Connection is ready to transfer messages
正确地发送到接收服务器并放入队列中\private$\receiver
。End2End log
接收服务器每条消息都会记录两个事件:
- 消息通过网络传来(EventId:4)
- 消息
ID CN=msmq, CN=[mymachinename], CN=Computers, DC=[domain], DC=[other]
已放入队列ReceiverServer\private$\receiver
(EventId:1)
然后我使用客户端应用程序发送服务器使用相同的代码。服务器正确地创建了一个带有Direct=OS:ReceiverServer\private$\receiver
和 的State:Connected
传出队列Connection History:Connection is ready to transfer messages
,我可以看到消息排队并被发送,但我没有在远程接收它们接收服务器队列.\private$\receiver
。如果我检查End2End 事件日志的接收服务器我只看到第一条消息(消息通过网络发送(EventId:4))但该消息并未放入队列。
我关闭了两台机器的防火墙,更改了队列的授权设置,并尝试了队列的以下端点:
FormatName:Direct=OS:[IPv6 address]\private$\receiver
FormatName:Direct=TCP:ReceiverServer\private$\receiver
FormatName:Direct=TCP:[IPv6 address]\private$\receiver
没有运气。Microsoft 的故障排除过程和文档非常笼统和简单,因此我决定在这里询问,因为对我来说这是一条死路。
答案1
我建议您将UserDeadLetterQueue
属性设置为消息。之后,您可以Transactional dead-letter messages
从计算机管理中检查源服务器和目标服务器上的系统队列。其中有“类”列,描述了无法传递消息的原因。