MSMQ消息在到达远程服务器时消失

时间:2015-01-21 16:13:51

标签: msmq system.messaging

我必须在同一域中的两台服务器 SenderServer (MS Server 2012)和 ReceiverServer (MS)之间创建 MSMQ 消息传递机制Server 2008 R2)。

我在 ReceiverServer .\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$\receiverState:Connected正确创建了一个传出队列Connection History:Connection is ready to transfer messages。 消息已正确发送到 ReceiverServer 并放置在\private$\receiver队列中。每封邮件的 ReceiverServer End2End log会记录两个事件:

  1. 消息来自网络(EventId:4)
  2. ID CN=msmq, CN=[mymachinename], CN=Computers, DC=[domain], DC=[other]的邮件已放入队列ReceiverServer\private$\receiver(EventId:1)
  3. 然后我使用相同的代码在 SenderServer 中使用了客户端应用程序。服务器正确创建了一个带有Direct=OS:ReceiverServer\private$\receiverState:Connected的传出队列Connection History:Connection is ready to transfer messages,我可以看到消息排队并发送但我没有在远程 ReceiverServer中收到它们队列.\private$\receiver。如果我检查 ReceiverServer End2End事件日志,我只看到第一条消息(消息来自网络(EventId:4)),但消息未放入队列中

    我关闭了两台计算机的防火墙,更改了队列的授权设置,并为队列尝试了以下端点:

    • FormatName:Direct=OS:[IPv6 address]\private$\receiver
    • FormatName:Direct=TCP:ReceiverServer\private$\receiver
    • FormatName:Direct=TCP:[IPv6 address]\private$\receiver

    没有运气。 Microsoft的故障排除过程和文档非常简洁,因此我决定在这里问一下,因为对我来说是一个死胡同。

2 个答案:

答案 0 :(得分:5)

发件人域帐户需要在远程队列上具有以下权限:发送,获取权限,获取属性

这些计算机是否位于同一个域中?如果不是,您可能需要将上述权限授予名为ANONYMOUS LOGON的本地用户

答案 1 :(得分:0)

我遇到了类似的问题,并花了几个小时来解决它,所以我想发布一个答案,以拯救可能陷入同样陷阱的其他人。

在远程服务器上创建队列时,它被错误地创建为事务性队列。但是,发布消息的代码是在没有transaction参数的情况下调用send。我可以在发送工作站看到该消息,但一旦它到达目标服务器,它就会消失而没有任何记录,日记或事件来帮助确定原因。

一旦我发现了问题,我就将Queue重新创建为非事务性队列,并解决了问题。