Получение 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;
}

Параметр транзакции устанавливается как «истина» при его вызове.

Я обнаружил, что когда во время обработки сообщения возникает исключение, вызывается tran.Abort, но в этот момент я ожидал, что сообщение будет возвращено в очередь. Однако этого не происходит, и сообщения теряются.

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

9
задан JohnCC 16 November 2011 в 03:53
поделиться