2017-02-09 140 views
0

我有一个Azure服务总线队列。当我将文件发送到此队列时,它将进入其死信队列。当我尝试从DLQ重新提交消息(文件)到其原始队列时,它又回到DLQ,但是现在该文件的内容正在获取垃圾邮件。谁能帮我这个?Azure服务总线DeadLetter队列

重新提交的代码如下。

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进行正确的异步调用。

相关问题