2012-02-11 95 views
0

我试图按照以下方式创建一个中毒消息场景。MSMQ中毒消息和TimeToReachQueue

1-在服务器(事务队列)上创建消息队列。 2-创建一个接收器应用程序来处理该服务器上的传入消息。 3-创建一个位于客户机上的客户端应用程序,该客户机使用队列的特定名称向该服务器发送消息。

4-我使用的发送方客户端的应用程序用下面的代码(C#4.0框架):

System.Messaging.Message mm = new System.Messaging.Message("Some msg"); 
mm.TimeToBeReceived = new TimeSpan(0, 0, 50); 
mm.TimeToReachQueue = new TimeSpan(0, 0, 30); 
mm.UseDeadLetterQueue = true; 

mq.Send(mm); 

因此,这是设置超时到达队列为30秒。

  • 第一次测试正常。消息已经通过,并被服务器应用程序接收。
  • 我的第二个测试,我断开了我的以太网电缆,然后从客户机发送另一个。

我可以在客户端计算机上的消息队列中看到消息正在等待发送(“等待连接”)。我的问题是,当它超过30秒(或50秒)时,消息永远不会进入客户机上的死信队列中。

这是为什么? ......我期待着它能够在那里超时。

测试在Windows 7(客户端)/ Windows Server 2008的R2(服务器)

+0

功能在Windows 7上。我刚刚使用旧测试应用程序运行测试,并在分配时间后消息从传出队列中消失。唯一不同的是我送到了一台想象中的机器上,因为我不能拉电缆。 所以它看起来像属性没有被正确设置。奇怪的。 – 2012-02-12 22:35:12

回答

0

你的问题了几天之久了。你有没有发现任何东西?

我对您的方案的解释是,拔掉电缆是关键。

在John描述的情况下,存在现有连接,并且接收方无法在设定的时间限制内正确处理消息。

但是,在您的场景中,接收端点永远不会有机会来处理消息,因此超时永远不会发生。如你所说,消息的状态是Waiting for connection。一条消息是从未发送过不能在逻辑上有一个超时到达其目的地

问问自己,如果队列本质上是不活动,那么Windows/MSMQ会不必要地牺牲多少资源并且多久检查一次MessageQueues?系统中可能有很多队列中有很多消息。

行为我会期望是,如果你插网线早在和连接重新建立的话,只有在需要的时候,你的带毒邮件时便会对超时检查,最终移动到DeadLetter队列。

你可能想检查这个场景 - 或者你是否已经检查过它?