MSMQ получает с транзакцией - откат не делает сообщение снова доступным
У меня есть это в классе под названием «MessageQueueReceive».
public MessageQueueTransaction BlockingReceive(out Message message)
{
MessageQueueTransaction tran = null;
message = null;
tran = new MessageQueueTransaction();
tran.Begin();
try
{
message = Queue.Receive(new TimeSpan(0, 0, 5), tran);
}
catch (MessageQueueException ex)
{
// If the exception was a timeout, then just continue
// otherwise re-raise it.
if (ex.MessageQueueErrorCode != MessageQueueErrorCode.IOTimeout)
throw ex;
}
return tran;
}
Тогда мой цикл обработки имеет следующее:
while (!Abort)
{
try
{
tran = this.Queue.BlockingReceive(out msg);
if (msg != null)
{
// Process message here
if (tran != null)
tran.Commit();
}
}
catch (Exception ex)
{
if (tran != null)
tran.Abort();
}
}
Инструмент панели управления показывает, что используемые мной очереди сообщений являются транзакционными. Очередь журнала не включена.
Этот код создает очередь: -
private static MessageQueue CreateMessageQueue(string queueName, bool transactional = false)
{
MessageQueue messageQueue = MessageQueue.Create(queueName, transactional);
messageQueue.SetPermissions("Administrators", MessageQueueAccessRights.FullControl,
AccessControlEntryType.Allow);
return messageQueue;
}
Транзакционный параметр устанавливается как «true», когда он вызывается.
Я обнаружил, что при возникновении исключения во время обработки сообщения вызывается tran.Abort, но в этот момент я ожидаю, что сообщение будет возвращено в очередь. Однако этого не происходит, и сообщения теряются.
Я что-то упускаю из виду? Кто-нибудь может увидеть, что я делаю не так?