Получение сообщения в транзакции

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

Очередь находится на компьютере с Windows Server 2003, и она определенно установлена ​​на транзакционную. Мой продюсер может без проблем помещать сообщения в очередь как часть транзакции. Я могу читать сообщения из очереди также без проблем, если я не делаю это в транзакции. Что я делаю неправильно?

Это блок кода, с помощью которого я пытаюсь использовать очередь:

using (MessageQueue msgQ = new MessageQueue(myQueueName))
{                   
    try
    {
        using (MessageQueueTransaction msgTx = new MessageQueueTransaction())
        {
            msgTx.Begin();

            msg = msgQ.Receive(new TimeSpan(0, 0, 0, 0, 1000), msgTx);
            Console.WriteLine("Message " + msg.LookupId.ToString() + " received");
            msg.Formatter = new XmlMessageFormatter(new string[] { "System.String,mscorlib" });
            if (ParseMessage(msg.Body.ToString()))
            {
                msgTx.Commit();
                Console.WriteLine("Message " + msg.LookupId.ToString() + " delivered");
            }
            else
            {
                msgTx.Abort();
                Console.WriteLine("Message " + msg.LookupId.ToString() + " not delivered");
            }
        }
    }
    catch (MessageQueueException exc)
    {
        if (exc.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout)
            Console.WriteLine("No more messages available");
        else
            Console.WriteLine("Unknown error encountered while receiving");
    }
}

Так что, если я удалю using (MessageQueueTransaction ...) инкапсуляция, все работает нормально, кроме, конечно, что я не могу commit или же abort транзакция в зависимости от логического результата ParseMessage(...)

Когда я добавляю биты транзакций, я получаю MessageQueueException как только я ударил msgQ.Receive(...) линия. Сообщение об исключении и база имеют значение null, а MessageQueueErrorCode является 0xc00e008b который в соответствии с этой страницей MSDN переводится как:

MQ_ERROR_OPERATION_NOT_SUPPORTED_BY_REMOTE_COMPUTER (0xC00E008B)

Возвращается, когда предпринята попытка получить или просмотреть сообщение, используя идентификатор поиска из удаленной очереди, находящейся на компьютере с MSMQ 1.0 или MSMQ 2.0.

Теперь, насколько мне известно, я не пытаюсь получать или просматривать на основе идентификатора поиска, плюс MSMQ работает на Windows Server 2003, что означает, что в любом случае это должен быть MSMQ 3.0.

Что я тут не так делаю?

1 ответ

Решение

Вы выполняете удаленный транзакционный прием. Это было введено в MSMQ 4.0. Обновите сервер до поддерживаемой операционной системы.

Как получить транзакционный удаленный прием с MSMQ?

Другие вопросы по тегам