Получение сообщения в транзакции
Я пишу основного производителя и потребителя 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. Обновите сервер до поддерживаемой операционной системы.