Тайм-аут MessageQueueTransaction - PullRequest
3 голосов
/ 06 мая 2011

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

Ответы [ 3 ]

2 голосов
/ 06 мая 2011

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

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

0 голосов
/ 24 февраля 2016

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

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

---- по MSDN https://msdn.microsoft.com/en-us/library/ms699870(v=vs.85).aspx

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

https://msdn.microsoft.com/en-us/library/ms707129(v=vs.85).aspx

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

0 голосов
/ 06 мая 2011

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

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

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

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

...