Ошибка MSMQ в нетранзакционной очереди

Имея простой код, который просматривает сообщение из очереди

message = myQueue.Peek(TimeOutForPeek);

С другой стороны сообщения просто отправляются в очередь:

sendQueue.Send(message);

Если myQueue является транзакционным, все работает нормально. Но если нет, то по прошествии определенного времени я получил исключение (см. Ниже), и обработка остановилась.

System.Messaging.MessageQueueException (0x80004005): операция была отменена до ее завершения. в System.Messaging.MessageQueue.ReceiveCurrent (тайм-аут TimeSpan, действие Int32, курсор CursorHandle, фильтр MessagePropertyFilter, MessageQueueTransaction internalTransaction, MessageQueueTransactionType transactionType) в System.Messaging.MessageQueue.Peek (тайм-аут TimeSpan)

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


person Gopher    schedule 26.11.2012    source источник
comment
Сколько времени / сколько сообщений в среднем до отказа? Мы говорим об 1 из 10 сообщений или 1 из 1000000? Через минуту начинает выходить из строя? Час? Неделя?   -  person tom redfern    schedule 26.11.2012
comment
Он обрабатывает около 3000-5000 сообщений за несколько минут, затем дает сбой и никогда не встает. Другими словами, это довольно большая нагрузка (на первый взгляд MSMQ является узким местом производительности)   -  person Gopher    schedule 26.11.2012
comment
Вы когда-нибудь находили решение этой проблемы? У меня аналогичная проблема. Спасибо   -  person tom redfern    schedule 13.03.2013
comment
@hugh, я не нашел решения. Мы изменили дизайн приложения, чтобы снизить нагрузку на MSMQ, и это помогло.   -  person Gopher    schedule 19.03.2013


Ответы (1)


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

Как вы указали в своем комментарии выше, что в течение короткого периода времени было получено 3000-5000 сообщений, я полагаю, что принимающая система все еще занята их обработкой, когда возникает ошибка, и не возвращается достаточно быстро, чтобы прочитать следующее сообщение (я) до истекло время ожидания.

Возможно, вы исчерпали лимит ресурсов вашей системы?

Ваше описание подошло бы ... Например, машина получает столько-то сообщений, но не может обработать их достаточно быстро до прихода следующих сообщений.

Если это работает для транзакционных очередей, я подозреваю, что обработка ресурсов MSMQ отличается в обоих сценариях.

Взгляните на очень подробное сообщение в блоге Джона Брейквелла Недостаточно ресурсов? Убегайте, бегите! и проверьте, есть ли что-нибудь, что может вам помочь. Там ОЧЕНЬ всего.

Другая мысль:

Если ваш принимающий конец является однопоточным, рассмотрите возможность параллельной обработки сообщений, если вы еще этого не сделали (если это применимо для вашего сценария). Это может помочь быстрее вывести сообщения из очереди до поступления новых сообщений.

person Jens H    schedule 28.11.2012