MSMQ Сделки

Я создал транзакционную очередь в MSMQ. Затем я успешно отправляю два сообщения в эту очередь. Первое сообщение вызовет ошибку в процессоре, и транзакция MSMQ будет откатана; следовательно сообщение будет возвращено в очередь. Второе сообщение будет успешно выполнено, и транзакция MSMQ будет зафиксирована.

Примечание: у меня нет кода для перемещения первого сообщения в другую / очередь ядовитых, но это означает, что оно будет забираться для обработки, и теоретически сообщение 2 никогда не получит шансов на обработку.

Проблема: если из этой транзакционной очереди получено 1 сообщение обработки / прослушивания / обработки, сообщение 2 никогда не будет получено. Это ожидается.

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

Примечание: Как я могу решить, что сообщение 1 не может быть обработано дальше, и перенесу его в другую очередь. Ведет ли MSMQ подсчет того, сколько раз процессор обрабатывал сообщения?

1 ответ

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

"Как я могу решить, что сообщение 1 не может быть обработано дальше, и переместить его в другую очередь". - WCF/MSMQ имеет встроенную обработку ядовитых сообщений. Вы можете смоделировать это самостоятельно с несколькими очередями повторных попыток. При первом сбое всегда переходите к очереди повторов #1; повторите сообщение и, в случае неудачи, всегда переходите в очередь на повтор № 2; повторите сообщение и в случае неудачи перейдите в последнюю очередь для расследования.

"Ведет ли MSMQ счетчик того, сколько раз процессор обрабатывал сообщение?" - нет

Другие вопросы по тегам