2017-02-09 1 views
0

У меня есть очередь служебных шин Azure. Когда я отправляю файл в эту очередь, он отправляется в очередь с мертвой буквой. Когда я пытаюсь повторно отправить сообщение (файл) из DLQ в его исходную очередь, оно снова возвращается к DLQ, но теперь содержимое файла получает СПАМ. Кто-нибудь может мне с этим помочь?Azure Service Bus DeadLetter QUEUE

Код для повторной подачи ниже.

string connectionString = ConfigurationManager.AppSettings["connectionString"]; 

string queueName = ConfigurationManager.AppSettings["deadLetterQueueName"]; 

ServiceBusConnectionStringBuilder builder = new ServiceBusConnectionStringBuilder(connectionString); 

MessagingFactory factory = MessagingFactory.CreateFromConnectionString(builder.ToString()); 

var client = QueueClient.CreateFromConnectionString(connectionString, queueName); 

string queueDeadletterPath = QueueClient.FormatDeadLetterPath(queueName); 

QueueClient deadletterQueueClient = factory.CreateQueueClient(queueDeadletterPath); 


      while (true) 
      { 
       BrokeredMessage msg = deadletterQueueClient.Receive(); 
       if (msg != null) 
       { 
        try 
        { 
         if(msg.Label == "Resubmitted") 
         { 
          msg.Complete(); 
         } 
         else 
         { 
          BrokeredMessage sendMsgBackToQueue = new BrokeredMessage(msg); 
          foreach(var prop in msg.Properties) 
          { 
           var targetProp = new KeyValuePair<string, object>(prop.Key, prop.Value); 
           sendMsgBackToQueue.Properties.Add(targetProp); 
          } 
          sendMsgBackToQueue.Label = "Resubmitted"; 
          Console.WriteLine("Message Resubmitted"); 
          client.SendAsync(sendMsgBackToQueue); 
          msg.Complete(); 
         } 
        } 
        catch (Exception ex) 
        { 
         // Log error 
         Console.WriteLine(ex.Message); 
         msg.Abandon(); 
        } 
       } 
       else 
       { 
        break; 
       } 
      } 

Screenshot

+0

Вы попробовали предложение? –

ответ

1

Конструктор вы используете BrokeredMessage(serializedObject) предполагает, что вы передадите это полезная нагрузка (тело сообщения) сериализовать, а не сообщение клонировать информацию.

ASB SDK имеет специальный BrokeredMessage.Clone() только для этой цели.

Примечание: вы заметили, что вы смешиваете асинхронные и синхронные вызовы. Это вызовет у вас проблемы, независимо от ASB. Возможно, вы захотите переключиться на синхронизацию или выполнить соответствующий вызов асинхронных вызовов с помощью await.

Смежные вопросы