Как использовать удаленный MSMQ для транзакций? - PullRequest
7 голосов
/ 25 сентября 2008

Я пишу службу 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, который мы кластеризируем и создаем резервную копию.

Ответы [ 5 ]

5 голосов
/ 25 сентября 2008

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

3 голосов
/ 25 сентября 2008

Использование TransactionScope должно работать при условии, что MSDTC работает на обеих машинах.

MessageQueue queue = new MessageQueue("myqueue");
using (TransactionScope tx = new TransactionScope()) {
    Message message = queue.Receive(MessageQueueTransactionType.Automatic);
    tx.Complete();
}
0 голосов
/ 16 ноября 2010

Aviod с использованием удаленного MSMQ (остальное обновление до MSMQ 4.0 для поддержки удаленной транзакции MSMQ). 1) В качестве альтернативы вы можете создать один веб-сервис для отправки сообщений 2) Создать локальный MSMQ для транзакции 3) Создайте небольшую утилиту, в которой есть номер пакета (пакета) и номера сообщений ... После сбоя пакета удалите сообщения в целевой папке, иначе сделайте это как объем транзакции

0 голосов
/ 19 декабря 2008

Чтобы использовать область транзакции, вы должны прежде, чем убедиться, что MSDTC установлен и подключение к удаленному клиенту было активировано.

Установка MSDTC не является проблемой, но активация подключения к удаленному клиенту должна вызвать перезагрузку сервера (в Windows Server 2003 это так).

Может быть, этот пост может помочь вам: Как активировать MSDTC и подключение удаленного клиента

0 голосов
/ 07 октября 2008

С тех пор я перешел на SQL Service Broker . Он поддерживает удаленный транзакционный прием, а MSMQ 3.0 - нет. И в качестве дополнительного бонуса он уже использует экземпляр SQL Server, который мы кластеризируем и создаем резервную копию.

...