在远程计算机上找不到MSMQ消息

时间:2012-11-16 17:45:47

标签: wcf msmq

我有一个WCF服务,设置为使用MSMQ传输到另一台机器上的服务。我们正试图将客户端移到另一台机器上,但它无法运行。启用MSMQ.End2End事件日志会给我们

Message with ID {6940f8fa-3d31-4db0-ae2b-59bc98c99f2c}\25321 was sent to queue DIRECT=OS:iisapp1-vvpm\private$\TransactionalEmailService/TransactionalEmail.Service.TransactionalEmailService.svc

这让我觉得它在我们的机器上运行正常,但我们在目标机器上找不到它的任何痕迹。该服务未被调用,我们无法在死信队列中找到该消息(或者我们可以想到的其他任何地方)。

此外,直接从我的机器上的Visual Studio运行代码会使其工作。

将接收队列更改为DEV计算机也会导致代码工作,这让我进一步认为这是接收计算机的问题。 (我只是不知道是什么)

更新1: 我回过头来,注意到我试图在事务死信队列中发送的所有消息。错误消息是“到达时间队列已经过去”。查看连接状态,它处于非活动状态,发送另一条消息不会导致它连接。我重新启动机器,它再次“连接”。我尝试再次发送消息,并查看队列状态。有12条消息,所有这些消息都是未确认的(0是未处理的)。

4 个答案:

答案 0 :(得分:1)

一旦端点机器重新启动,它就会再次发生。我看到了这篇文章,这是真正的解决方案:

http://blogs.msdn.com/b/johnbreakwell/archive/2007/02/06/msmq-prefers-to-be-unique.aspx

(如果链接消失:)

看起来MSMQ中有一个ID作为消息的一部分发送。远程主机将该ID用作缓存中的密钥,以确定将ack发送回的人员。如果您克隆一台计算机,它会在该注册表中为该ID获取相同的值,这会使另一台计算机无法知道将其发回给谁。所以它会将它发送到错误的机器,这将丢弃它,而另一台机器将会遇到它一直试图发送的一堆消息。这也解释了为什么它刚开始工作一天......缓存已过期,“正确”机器作为端点投入使用。

在克隆的计算机上重新安装MSMQ可以解决问题。

答案 1 :(得分:0)

我真的不确定这可能是这种情况(我在MSMQ的上下文中没有任何WCF经验),但是你所说的这种行为的一个更常见的原因是在使用MessageQueue构造函数(例如'FormatName:DIRECT = ...')时,或者在某种程度上错误地命名时,在队列名中缺少FormatName上的强制性camel大小写。 svc结束时,消息中的队列名称看起来有点奇怪,但这可能只是一个WCF的事情?希望这有助于至少让你朝着正确的方向前进。

答案 2 :(得分:0)

不知道该说些什么,但现在有效。阅读一些内容有助于指出队列的状态(单击“功能/消息队列”下的“传出队列”)。从那里我发现这篇知识库文章有一个修补程序:http://support.microsoft.com/kb/976438它似乎不适用,但人们所拥有的症状都是一样的。我们的家伙试图安装它,但它失败了,他们没有重启...但由于某种原因,消息队列开始工作。

如果有人带来了一些洞察力,我会很乐意向他们投票或给予他们赏金(如果很快的话)。但我现在接受这个作为答案。

答案 3 :(得分:-1)

这通常是由远程队列的权限引起的,通常的情况是如果您使用的是私有队列,并且这是由您的wcf服务远程访问的。

尝试使用公共队列。