Тайм-аут MessageQueueTransaction

#.net #transactions #timeout #msmq

#.net #транзакции #тайм-аут #msmq

Вопрос:

Я читал о MessageQueueTransaction в MSDN, но я ничего не могу найти о тайм-аутах. Что произойдет, если фиксация или прерывание просто никогда не вызываются? Существует ли какой-то тайм-аут для транзакции между моментом ее открытия и выпуском?

Ответ №1:

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

У вас есть конкретная проблема или просто любопытно?

Приветствия

Джон Брейквелл

Комментарии:

1. Если подумать, это имеет смысл: транзакция DTC предназначена для координации между несколькими менеджерами ресурсов. Тайм-аут — это страховка от того, что один из них отключится, никогда не ответит и, таким образом, заблокирует всех остальных. Для внутренней транзакции MSMQ другого менеджера ресурсов нет, поэтому эта «страховка» не нужна.

Ответ №2:

Спасибо, Джон! Я только что создал службу WCF, которая получает сообщения от MSMQ и передает их обратно удаленному клиенту. Клиент может запросить x количество сообщений.

Клиент сначала вызывает службу, чтобы начать транзакцию. Служба помещает его в коллекцию с идентификатором GUID. Этот идентификатор guid отправляется обратно клиенту, и клиент будет использовать его для всех других вызовов службы. Следовательно, служба может найти соответствующую транзакцию и использовать ее с помощью Receive().

После того, как клиент выполнил всю свою работу, он вызывает метод Terminate (bool commit) с идентификатором GUID, который вызывает фиксацию или прерывание транзакции. Но что добавить, если фиксация или прерывание никогда не вызываются из-за сбоя клиента или сети? Это моя проблема…

В основном я сделал это, потому что MSMQ 3 не поддерживает удаленную транзакцию (только MSMQ 4).

Ответ №3:

Ответ заключается во внутреннем обмене сообщениями ACK самого MSMQ. Итак, чтобы ответить на ваш вопрос, несомненно, если вы НЕ зафиксируете или не прервете сообщение, которое использует транзакцию после его извлечения, оно фактически выполнит откат. Вот как обрабатываются события потери питания и т.д.

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

—- Согласно MSDN https://msdn.microsoft.com/en-us/library/ms699870 (v =против85).aspx

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

https://msdn.microsoft.com/en-us/library/ms707129 (v = против85).aspx

Надеюсь, это поможет.