MSMQ - сообщения обрабатываются снова и снова - PullRequest
4 голосов
/ 22 февраля 2010

Мы используем MSMQ и механизм интеграции, который обрабатывает сообщения. Этот механизм анализирует и проверяет каждое сообщение в транзакционном контексте, и если проверка не удалась, происходит откат и сообщение доставляется обратно в очередь. Кроме того, механизм интеграции ждет 20 секунд, чтобы снова обработать сообщения об ошибках.

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

У кого-нибудь есть подсказка?

Обновлено с помощью телефонного кода

using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
    //message validation function
    servicoIntegracao.Validar(identificadorMensagem, mensagem.Substring(_tamanhoCampoTipoEvento));
    servicoIntegracao.ExecutarServico();
    AtualizarStatusEventoNegocio(identificadorMensagem, Status.Finalizado);
    retorno = 0;
    ts.Complete();
}

1 Ответ

3 голосов
/ 22 февраля 2010

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

Первое, что вам нужно сделать, это создать очередь неудачных проверок для сообщений, которые вы не хотите обрабатывать снова. (Полезно хранить сообщения для исследования проблем, и очередь - естественное место.)

Затем, если вы хотите повторить попытку только один раз, вы можете записать ее в очередь повторов и изменить процесс проверки так, чтобы он отправлял сообщения об ошибках из очереди повторов в очередь неудачных проверок .

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

Как только сообщение достигает максимально разрешенных попыток, ваш процесс может отправить его в очередь неудачных проверок .

С MSMQ вам не обязательно изменять формат сообщения: вы можете использовать Message.Extension для хранения количества попыток, хотя обычно это не одобряется - как сказано в документации этого свойства: «По возможности вы должны включать данные сообщения в свойство Body сообщения, а не в свойство Extension».

...