2017-04-20 3 views
0

Ich habe eine Funktion, die überprüft, ob es noch eine Nachricht in meinem Servicebus gibt, die es ständig überprüft.Servicebus messagecount check gibt true zurück, obwohl es 0 ist

Die Funktion, die die ammount erhält, ist:

public int GetActiveMessageCount() 
    { 
     var connectionString = azureConnectionStringWithoutEntityPath; 
     long messageCount = 0; 
     try 
     { 
      var nameSpaceManager = NamespaceManager.CreateFromConnectionString(connectionString); 
      messageCount = nameSpaceManager.GetQueue(azureQueueName).MessageCountDetails.ActiveMessageCount; 
     } 
     catch 
     { 
      throw; 
     } 

     return (int)messageCount; 
    } 

Und die Prüfung ist:

public bool MessageCountBiggerThenZero() 
    { 
     int messageCount = 0; 
     try 
     { 
      messageCount = this.GetActiveMessageCount(); 
     } 
     catch (Exception e) 
     { 
      Debug.WriteLine("An error occured while checking if the messageValue is bigger then zero and not null saying : " + e); 
     } 
     return messageCount > 0; 
    } 

das funktioniert perfekt am Anfang, wenn es Null-Meldungen sind aber, nachdem sie den Empfang von Nachrichten beginnt und dann Übergibt die letzte messagesage es besteht noch die MessageCountBiggerThenZero Prüfung.

Weiß jemand, wie das sein kann? Gibt der ServiceBus nach der letzten Nachricht andere Werte zurück?

Edit:

Mehr Einblick in die Prüfung (also es geht immer noch die if-Anweisung, auch wenn es keine Meldung mehr ist):

public object RecieveOneMessageFromServiceBus() 
    { 
     var client = QueueClient.CreateFromConnectionString(azureConnectionString); 
     BrokeredMessage brokermessage = null; 
     client.PrefetchCount = 1; // get 1 message at a time 
     if (MessageCountBiggerThenZero()) 
     { 
      try 
      { 
       // try to recieve message 
      } 
      catch 
      { 
       throw; 
      } 
     } 
     else 
     { 
      return null; 
     }  
    } 
+0

Wo sind Sie 'MessageCountBiggerThenZero' Methode aufrufen, könnten Sie bieten den Code über den Empfang von Nachrichten und Aufrufen der MessageCountBiggerThenZero überprüfen? –

+0

@ Bruce-MSFT Ich habe den Code zu der Frage hinzugefügt. Ich benutze es auch an anderen Orten, aber sie haben das gleiche Ergebnis. – Tvt

Antwort

0

Ok Ich habe es anscheinend behoben, aber ich habe keine Ahnung, wie und warum. Ich habe es implementiert, wie Bruce sagt, aber das hat nicht funktioniert. Vielleicht wurde das gesamte Verfahren nicht schnell genug senden oder etwas anderes ist eine gehen, aber jetzt änderte ich meine Empfangsverfahren einen Timer für die Botschaft von ca. 5 Sekunden wie zu empfangen und löschen und das hinzugefügt:

var client = QueueClient.CreateFromConnectionString(azureConnectionString,ReceiveMode.ReceiveAndDelete); 

brokermessage = client.Receive(TimeSpan.FromSeconds(5)); 

Mit diesem Code es scheint zu funktionieren und jeder, der mir erklären kann, warum, wäre sehr gefragt.

Edit:

Siehe Kommentar unten für zusätzliche Erklärung, wie diese besser implementieren

+0

Wird die 'RecieveOneMessageFromServiceBus'-Methode in Multi-Thread ausgeführt? Ich nahm an, dass eine Instanz 'MessageCountBiggerThenZero' aufruft, während die letzte Nachricht mit 'PeekLock'-Modus in einer anderen Instanz empfangen wird, bevor' complete 'aufgerufen wird. Ich würde es bevorzugen, 'QueueClient.OnMessage' zu ​​verwenden, um Warteschlangennachrichten zu empfangen. –

+0

Korrekt. Das war es wahrscheinlich schon. Ich werde den Code später ändern, um meinen Bedürfnissen besser gerecht zu werden. – Tvt

+0

Da meine Antwort dieses Problem nicht reproduzieren konnte, könnten Sie Ihre Antwort mit weiteren Details aktualisieren und sie als akzeptable Antwort für andere Benutzer markieren, die das gleiche Problem haben könnten. –

0

Code Laut, ging ich davon aus, dass Sie dies nicht tun Rufen Sie BrokeredMessage.Complete auf, was die Nachricht als verarbeitet markieren und löschen könnte, nachdem Sie die Nachricht bearbeitet haben. Ich änderte den Code und fügen Sie meldet den aktuellen aktiven Nachrichten zu drucken, wie folgt:

public static object RecieveOneMessageFromServiceBus() 
{ 
    var client = QueueClient.CreateFromConnectionString(azureConnectionString); 
    client.PrefetchCount = 1; // get 1 message at a time 
    if (MessageCountBiggerThenZero()) 
    { 
     try 
     { 
      Console.WriteLine("begin retrieving a message..."); 
      var message = client.Receive(); 
      Console.WriteLine($"received message with MessageId:{message.MessageId}"); 

      //after receive the message for handling 
      Console.WriteLine($"after received a message in processing, active messages count:{GetActiveMessageCount()}"); 

      //after handled the message 
      message.Complete(); 

      Console.WriteLine($"invoke message.Complete() to complete the received message"); 

      //after receive the message for handling 
      Console.WriteLine($"after Complete() the message, active messages count:{GetActiveMessageCount()}"); 
     } 
     catch 
     { 
      throw; 
     } 
    } 
    return null; 
} 

enter image description here

Auch könnten Sie das Azure-Portal einloggen und überprüfen Sie die ACTIVE MESSAGE COUNT unter der Übersicht Ihrer Service Bus Warteschlange wie folgt:

enter image description here

Darüber hinaus können Sie die offizielle Tutorial über folgen Receive messages from the queue mit Überprüfen Sie die aktuellen aktiven Nachrichten selbst, Sie können auch auf diese issue beziehen.

+0

Hey Bruce, ich beschreibe es leider als komplett. Wie gesagt, alles läuft perfekt bis ich die letzte Nachricht vervollständige.In diesem Moment habe ich zum Beispiel 40 Nachrichten ohne ein einziges Problem gelesen, aber wenn ich die 0 aktive Nachricht erreiche, sagt die MessageCountBiggerThenZero() Funktion immer noch eine Nachricht, die einen echten Booleschen Wert anzeigt. – Tvt

+0

Nachdem du die letzte Nachricht vervollständigt hast, hast du das überprüft ** ** ACTIVE MESSAGE COUNT ** auf Azure Portal? –

+0

ja und die Funktion tut dies auch sofort mit: this.GetActiveMessageCount(); – Tvt

Verwandte Themen