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, но в этот момент я ожидаю, что сообщение будет возвращено в очередь. Однако этого не происходит, и сообщения теряются.

Я что-то упускаю из виду? Кто-нибудь может увидеть, что я делаю не так?

Ответы на вопрос(2)

Ваш ответ на вопрос