Я пишу службу Windows, которая извлекает сообщения из MSMQ и отправляет их в устаревшую систему (Baan). Если сообщение терпит неудачу или машина отключается во время сообщения, я не хочу терять сообщение. Поэтому я использую транзакции MSMQ. Я прекращаю свою работу в случае неудачи и фиксирую успех.
При работе с локальной очередью этот код работает хорошо. Но в процессе работы я хочу отделить машину (или машины), на которой запущен сервис, от самой очереди. При тестировании в удаленной очереди выдается исключение System.Messaging.MessageQueueException: «Использование транзакции недопустимо».
Я подтвердил, что рассматриваемая очередь является транзакционной.
Вот код, который получает из очереди:
// Begin a transaction.
_currentTransaction = new MessageQueueTransaction();
_currentTransaction.Begin();
Message message = queue.Receive(wait ? _queueTimeout : TimeSpan.Zero, _currentTransaction);
_logger.Info("Received a message on queue {0}: {1}.", queue.Path, message.Label);
WORK_ITEM item = (WORK_ITEM)message.Body;
return item;
Ответ
С тех пор я перешел на SQL Service Broker . Он поддерживает удаленный транзакционный прием, а MSMQ 3.0 - нет. И в качестве дополнительного бонуса он уже использует экземпляр SQL Server, который мы кластеризируем и создаем резервную копию.