Распределенная транзакция MSMQ (DTC) не может импортировать транзакцию
Мне нужно получить, обработать и отправить сообщение за одну транзакцию. Поскольку MSMQ не поддерживает Transactional Remote Receive, для этого я использую DTC. Сейчас я даже не могу получить сообщение. Вот код, который я использую для этого:
string queueName = "trxwrite";
string serverName = "mqtest";
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
MessageQueue mq = new MessageQueue(string.Format(@"FormatName:DIRECT=OS:{0}\{1}", serverName, queueName));
mq.Formatter = new XmlMessageFormatter(new[] {typeof (string)});
Message message = mq.Receive(MessageQueueTransactionType.Automatic);
ts.Complete();
}
- Очередь транзакционная.
- DTC включен на сервере
mqtest
и настроен для разрешения входящих и исходящих. - Брандмауэр настроен на разрешение всех запросов MSMQ и DTC.
Я получаю следующее сообщение об ошибке: Невозможно импортировать транзакцию. Кто-нибудь может помочь? Кроме того, как мой клиентский компьютер узнает, что он должен использовать DTC на сервере для транзакции? Не могу судить по найденным образцам...
1 ответ
Очевидно, что код DTC должен быть установлен и настроен для обеспечения доступа к сети как на клиенте, так и на сервере. Таким образом, этот фрагмент отлично работает:
string queueName = "trxwrite";
string queue2Name = "trxread";
string serverName = "mqtest";
Parallel.For(0, 300, (int i) =>
{
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
MessageQueue mq = new MessageQueue(string.Format(@"FormatName:DIRECT=OS:{0}\{1}", serverName, queueName));
mq.Formatter = new XmlMessageFormatter(new[] { typeof(DateTime) });
Message message = mq.Receive(MessageQueueTransactionType.Automatic);
DateTime createDt = (DateTime)message.Body;
MessageQueue mq2 = new MessageQueue(string.Format(@"FormatName:DIRECT=OS:{0}\{1}", serverName, queue2Name));
mq2.Formatter = new XmlMessageFormatter(new[] { typeof(DateTime) });
Message messageToSend = new Message(createDt);
mq2.Send(messageToSend, MessageQueueTransactionType.Automatic);
ts.Complete();
}
});