2015-03-21 2 views
1

Я пишу приложение, которое просматривает сообщение из Microsoft Message Queue (MSMQ). Я хочу, чтобы мое приложение просматривало сообщения MSMQ поочередно (от первого сообщения до последнего сообщения). После полного просмотра последнего сообщения основной поток будет заблокирован до появления сообщения MSMQ.
Я уже использовал MessageQueue.Peek (TimeSpan, Cursor, PeekAction) Метод с TimeSpan = MessageQueue.InfiniteTimeout и есть проблема: значение MessageQueue.InfiniteTimeout приблизительно 49 дней, но я хочу, чтобы мое приложение будет ждать нового сообщения с очень долгое время (около 1000 дней), я уже переключил TimeSpan = TimeSpan.MaxValue, но не добился успеха. Не могли бы вы дать мне несколько решений или советов? благодаря!
Мой следующий код:
Сообщение Peek MSMQ с неограниченным таймаутом

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

+0

Как насчет простой повторной попытки по таймауту? –

+0

Можете ли вы объяснить мне, как повторить попытку? Я действительно не знаю, как это сделать. Если вы можете мне помочь, напишите в разделе ответа. Спасибо! – GIANGPZO

+0

См. Ответ Томаса Яскулы. –

ответ

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

Я не знаю, у вас конкретный прецедент, но так долго ждать сообщения в очереди не является обычным явлением.

+0

Мое приложение будет поддерживать другое приложение. Например, если у этого приложения есть еще одна проблема, которую он не может решить, он отправит сообщение в MSMQ, а затем мое приложение будет ** peek() ** это сообщение и поможет ему выполнить работу, поэтому мое приложение будет ждать сообщения MSMQ непрерывно и очень долго. – GIANGPZO

+0

Помогает ли мой ответ в этом? –

+0

В предыдущем вопросе [ссылка] (http://stackoverflow.com/questions/29117142/peek-msmq-message-with-infinite-timeout/29119493?noredirect=1#comment46622640_29119493), вы уже так мне помогли , Большое спасибо! – GIANGPZO

Смежные вопросы