2015-04-24 4 views
1

Мне нужно получить, обработать и отправить сообщение в одной транзакции. Поскольку MSMQ не поддерживает Transactional Remote Receive, для этого я использую DTC. Прямо сейчас, я даже не могу получить сообщение. Вот код, я использую для этого:Распределенная транзакция MSMQ (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 на сервере для транзакции? Не могу сказать по образцам, которые я нашел до сих пор ...

ответ

0

Очевидно, что 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(); 
          } 
         }); 
Смежные вопросы