【问题标题】:Peek MSMQ message with unlimited timeout无限超时查看 MSMQ 消息
【发布时间】:2015-05-24 21:59:16
【问题描述】:

我正在编写一个从 Microsoft 消息队列 (MSMQ) 中窥视消息的应用程序。我希望我的应用程序依次查看 MSMQ 消息(从第一条消息到最后一条消息)。在完全窥视完最后一条消息后,主线程将被阻塞,直到 MSMQ 有新消息到达。
我已经使用 MessageQueue.Peek(TimeSpan, Cursor, PeekAction) 方法和 TimeSpan=MessageQueue.InfiniteTimeout 并且有一个问题:MessageQueue.InfiniteTimeout 值大约 49 天,但我希望我的应用程序会等待很长时间(大约 1000 天)的新消息,我已经切换 TimeSpan = TimeSpan.MaxValue 但没有成功。你能给我一些解决方案或建议吗?谢谢!
我的代码是这样的:

while (true) {
  if (isTheFirst) {
    try {
      ret = mq.Peek(MessageQueue.InfiniteTimeout, cursor, PeekAction.Current);
      Console.WriteLine(ret.Id);
      isTheFirst = false;
    } catch (MessageQueueException e) {
      // what can we do?
    }
  } else {
    try {
      // because MessageQueue.InfiniteTimeout value approximate 49 days, so if 
      // during 49 days, Message Queue didn't receive any message, my app will 
      // thrown exception but i want my app to continue wait for new message arrive
      ret = mq.Peek(MessageQueue.InfiniteTimeout, cursor, PeekAction.Next);
      Console.WriteLine(ret.Id);
    } catch (MessageQueueException ex) {
      // what can we do?
    }
  }
  Thread.Sleep(1000);
}

【问题讨论】:

  • 简单的超时重试怎么样?
  • 你能解释一下如何在超时时重试吗?我真的不知道该怎么办。如果你能帮助我,请写在答案部分。谢谢!
  • 见 Thomas Jaskula 的回答。

标签: c# msmq timespan peekmessage


【解决方案1】:

您可以尝试捕获特定错误,记录它,然后循环将继续 Peek 下一条消息。

while (true) {
  if (isTheFirst) {
    //... omitted for brievety
  } else {
    try {
      ret = mq.Peek(MessageQueue.InfiniteTimeout, cursor, PeekAction.Next);
      Console.WriteLine(ret.Id);
    } catch (MessageQueueException e) {
      if(e.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout)
      {
          Console.WriteLine("Log here that Timeout has occured");
          continue; // will skip Thread.Sleep(1000); and whatever code you put after
      }
      else
      {
         Console.WriteLine("Log exception and rethrow");
         throw;
      }
    }
  }
  Thread.Sleep(1000);
}

我不知道你的具体用例,但等待队列中的消息这么长时间并不常见。

【讨论】:

  • 我的应用程序将支持另一个应用程序。例如,如果该应用程序有另一个无法解决的问题,它将向 MSMQ 发送消息,然后我的应用程序将 peek() 该消息并帮助它执行工作,因此我的应用程序将等待对于 MSMQ 消息持续很长时间。
  • 我的回答对你有帮助吗?
  • 在上一个问题 [link] (stackoverflow.com/questions/29117142/…) 中,您已经帮了我很多忙。非常感谢!
  • 没问题。如果它解决了您的问题,请不要犹豫,投票并关闭。
猜你喜欢
  • 2011-05-28
  • 2010-11-05
  • 2018-02-20
  • 2013-12-01
  • 1970-01-01
  • 2010-12-27
  • 1970-01-01
  • 2012-06-06
相关资源
最近更新 更多