1

Microsoft Message Queue (MSMQ) からメッセージをピークするアプリケーションを作成しています。アプリケーションが順番に (最初のメッセージから最後のメッセージまで) MSMQ メッセージをピークするようにします。最後のメッセージを完全にピークした後、MSMQ が新しいメッセージを受信するまで、メイン スレッドはブロックされます。TimeSpan=MessageQueue.InfiniteTimeoutでMessageQueue.Peek(TimeSpan, Cursor, PeekAction) メソッドを
既に使用しており、問題があります。 (約 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);
}

4

1 に答える 1

1

特定のエラーをキャッチしてログに記録すると、ループが次のメッセージのピークに進みます。

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);
}

特定のユースケースはわかりませんが、キューでメッセージを長時間待つのは普通ではありません。

于 2015-03-23T08:47:27.817 に答える