MSMQ Poison消息和TimeToReachQueue

时间:2012-02-11 23:36:23

标签: c# msmq

我尝试以下列方式创建一个有害消息场景。

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(服务器)

上测试

1 个答案:

答案 0 :(得分:0)

你的问题已经有几天了。你找到了什么吗?

我对您的方案的解释是,未插电的电缆是关键。

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

但是,在您的场景中,接收端点永远不会有机会处理该消息,因此永远不会发生超时。如您所说,消息的状态为Waiting for connection从未发送的邮件在逻辑上无法超时到达目的地

请问自己,如果队列基本上不活动,Windows / MSMQ将不必要地牺牲多少资源 - 以及多久 - 检查MessageQueues的多少条件?可能有很多队列在系统上有很多消息。

期望的行为是,如果您重新插入网络电缆并重新建立连接,那么仅在需要时您的毒药消息将被检查超时并最终移动到DeadLetter队列。

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