MSMQ грешка в опашката без транзакции

Имате прост код, който надниква съобщение от опашката

message = myQueue.Peek(TimeOutForPeek);

От другата страна съобщенията просто се изпращат на опашка:

sendQueue.Send(message);

Ако myQueue е транзакционен, тогава всичко работи добре. Но ако не, след известно време на изпълнение получих изключение (вижте по-долу) и обработката спира.

System.Messaging.MessageQueueException (0x80004005): Операцията е отменена, преди да може да бъде завършена. в System.Messaging.MessageQueue.ReceiveCurrent(TimeSpan timeout, Int32 action, CursorHandle cursor, MessagePropertyFilter filter, MessageQueueTransaction internalTransaction, MessageQueueTransactionType transactionType) at System.Messaging.MessageQueue.Peek(TimeSpan timeout)

Какво може да причини такава разлика и как да се справим с подобни повреди? Не съм много запознат с MSMQ, всяка помощ ще бъде оценена.


person Gopher    schedule 26.11.2012    source източник
comment
Колко време/колко съобщения средно преди да се провали? Говорим ли за 1 на 10 съобщения или 1 на 1 000 000? Започва ли да се поврежда след минута? Час? Седмица?   -  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 ресурси се различава и в двата сценария.

Разгледайте много подробната публикация в блога на John Breakwell Недостатъчни ресурси? Бягайте, бягайте! и проверете дали има нещо, което можете да намерите за полезно. Вътре има МНОГО неща.

Друга мисъл:

Ако вашият получател е с една нишка, помислете за паралелна обработка на съобщенията, ако все още не го правите (ако е приложимо за вашия сценарий). Това може да помогне за изваждането на съобщенията от опашката по-бързо, преди да пристигнат новите съобщения.

person Jens H    schedule 28.11.2012