2017-02-09 10 views
0

私はAzureサービスバスキューを持っています。このキューにファイルを送信するときに、デッドレターキューに移動します。 DLQから元のキューにメッセージ(ファイル)を再送信しようとすると、再びDLQに戻りますが、ファイルの内容がSPAMを取得しています。誰も私にこれを手伝うことができますか?Azureサービスバスデッドレター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で適切な非同期呼び出しを呼び出すことができます。