MSMQ 消息在到达远程服务器时消失
MSMQ messages disappear when they get to remote server
我必须在同一域中的两个服务器 SenderServer (MS Server 2012) 和 ReceiverServer (MS 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) 上对其进行了测试,它正确地创建了带有 State:Connected
和 Connection History:Connection is ready to transfer messages
的传出队列 Direct=OS:ReceiverServer\private$\receiver
。
消息被正确发送到 ReceiverServer 并放置在 \private$\receiver
队列中。 ReceiverServer 的 End2End log
每条消息记录两个事件:
- 消息来自网络(EventId:4)
- 带有
ID CN=msmq, CN=[mymachinename], CN=Computers, DC=[domain], DC=[other]
的消息已放入队列 ReceiverServer\private$\receiver
(EventId:1)
然后我使用相同的代码从 SenderServer 中使用客户端应用程序。服务器使用 State:Connected
和 Connection History:Connection is ready to transfer messages
正确地创建了传出队列 Direct=OS:ReceiverServer\private$\receiver
,我可以看到消息排队并被发送,但我没有在远程 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 的故障排除过程和文档非常笼统和简单,因此我决定在这里提问,因为对我来说这是一个死胡同。
发件人域帐户需要对远程队列具有以下权限:发送、获取权限、获取属性
这些机器是否在同一个域中?如果不是,您可能需要将上述权限授予名为 ANONYMOUS LOGON
的本地用户
我 运行 遇到了类似的问题并花了几个小时来解决它,所以我想 post 一个答案来拯救可能落入与我相同的陷阱的其他人。
在远程服务器上创建队列时,它被错误地创建为 t运行sactional 队列。但是,post发送消息的代码调用发送时没有 t运行saction 参数。我可以在发送工作站看到该消息,但一旦它到达目标服务器,它就会消失,没有任何日志记录、日志记录或事件来帮助确定原因。
确定问题后,我将队列重新创建为非 运行sactional 队列,问题得到解决。
我必须在同一域中的两个服务器 SenderServer (MS Server 2012) 和 ReceiverServer (MS 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) 上对其进行了测试,它正确地创建了带有 State:Connected
和 Connection History:Connection is ready to transfer messages
的传出队列 Direct=OS:ReceiverServer\private$\receiver
。
消息被正确发送到 ReceiverServer 并放置在 \private$\receiver
队列中。 ReceiverServer 的 End2End log
每条消息记录两个事件:
- 消息来自网络(EventId:4)
- 带有
ID CN=msmq, CN=[mymachinename], CN=Computers, DC=[domain], DC=[other]
的消息已放入队列ReceiverServer\private$\receiver
(EventId:1)
然后我使用相同的代码从 SenderServer 中使用客户端应用程序。服务器使用 State:Connected
和 Connection History:Connection is ready to transfer messages
正确地创建了传出队列 Direct=OS:ReceiverServer\private$\receiver
,我可以看到消息排队并被发送,但我没有在远程 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 的故障排除过程和文档非常笼统和简单,因此我决定在这里提问,因为对我来说这是一个死胡同。
发件人域帐户需要对远程队列具有以下权限:发送、获取权限、获取属性
这些机器是否在同一个域中?如果不是,您可能需要将上述权限授予名为 ANONYMOUS LOGON
的本地用户我 运行 遇到了类似的问题并花了几个小时来解决它,所以我想 post 一个答案来拯救可能落入与我相同的陷阱的其他人。
在远程服务器上创建队列时,它被错误地创建为 t运行sactional 队列。但是,post发送消息的代码调用发送时没有 t运行saction 参数。我可以在发送工作站看到该消息,但一旦它到达目标服务器,它就会消失,没有任何日志记录、日志记录或事件来帮助确定原因。
确定问题后,我将队列重新创建为非 运行sactional 队列,问题得到解决。