2015-08-12 9 views
3

Я пытаюсь прочитать данные из приватной очереди MSMQ, и я пытаюсь протестировать сбой, чтобы быть уверенным, что если процесс не завершится, то детали останутся в очереди , На данный момент в пределах моей транзакции он попадает в мою новую строку Exception и, как и ожидалось, попадает в блок catch, но выглядит так, как будто транзакция. Завершено, потому что после того, как исключение было выбрано, очередь пуста: вот мой фрагмент кода -MSMQ игнорируя объем транзакции

try 
     { 

      using (TransactionScope transaction = new TransactionScope()) 
      { 

       Message incoming = new Message 
       { 
        Formatter = formatter, 
        AcknowledgeType = AcknowledgeTypes.FullReceive, 
        Recoverable = true 

       }; 

       incoming = msgQ.Receive(new TimeSpan(0, 0, 3), MessageQueueTransactionType.Single); 

       if (incoming != null) 
       { 
        MemoryStream mem = (MemoryStream) incoming.BodyStream; 
        mem.Seek(0, SeekOrigin.Begin); 
        IFormatter ifm = new BinaryFormatter(); 
        var deserialisedMessage = (TravelMessageServiceObjects) ifm.Deserialize(mem); 
        ISubmissionsService submissionsService = new SubmissionsService(); 
        bool retVal = submissionsService.PerformSubmission(deserialisedMessage.Products, deserialisedMessage.PolicyReference); 
        if (!retVal) 
        { 

         string errorMessage = string.Concat("Policy Ref: ", deserialisedMessage.PolicyReference, 
          " Product: ", Enum.GetName(typeof(Products), deserialisedMessage.Products)); 
         throw new Exception(errorMessage); 
        } 
       } 
       transaction.Complete(); 
      } 

     } 
     catch (Exception ex) 
     { 
      IError logger = new Logger(); 
      logger.Log(this, SeverityEnum.Warning, ex); 

     } 

ответ

4

Создайте свою очередь, как транзакционный

enter image description here

и установить MessageQueueTransactionType в Automatic. Single работает только с внутренними транзакциями очереди сообщений.

incoming = msgQ.Receive(new TimeSpan(0, 0, 3), MessageQueueTransactionType.Automatic); 

Проверка, MSDTC Работает.

Проверка, брандмауэры не блокируют связь

+0

Да, это транзакционный. – bilpor

+0

Я также попытался изменить класс transactionScope на MessageQueueTransaction. MessageQueueTransaction transaction = new MessageQueueTransaction(); try {transaction.Begin(); Message incoming = msgq.Receive (новый TimeSpan (0,0,3), транзакция); и теперь я получаю сообщение об ошибке в строке «Получение»: последовательность транзакций транзакций недействительна. – bilpor

+0

@bilpor обновил мой ответ, попробуйте это, пожалуйста, – Backs