Übung: Abrufen einer Nachricht aus der Warteschlange

Abgeschlossen

Vervollständigen wir nun die Anwendung, indem wir Code schreiben, um die nächste Nachricht in der Warteschlange zu lesen, sie zu verarbeiten und anschließend aus der Warteschlange zu löschen.

Wir platzieren den Code in der Anwendung und führen ihn aus, wenn ein Benutzer die entsprechenden Menüelemente auswählt. In einem realen Szenario sollte dieser Code in einer separaten Anwendung zum Empfangen und Verarbeiten von Nachrichten platziert werden.

Einsehen der nächsten Nachricht

Fügen Sie eine neue Methode hinzu, die die nächste Nachricht aus der Warteschlange einsehen kann.

  1. Öffnen Sie die Quelldatei Program.cs in Ihrem Editor.

  2. Suchen Sie die PeekMessageAsync-Methode in der Anwendung, und löschen Sie die Zeile, die eine NotImplementedException auslöst.

  3. Fügen Sie der Methode den folgenden Code hinzu. Dieser Code sieht die nächste Nachricht in der Warteschlange ein und gibt einige Informationen zur Nachricht aus.

            Response<PeekedMessage> response = await queueClient.PeekMessageAsync();
            PeekedMessage message = response.Value;
    
            Console.WriteLine($"Message id  : {message.MessageId}");
            Console.WriteLine($"Inserted on : {message.InsertedOn}");
            Console.WriteLine("We are only peeking at the message, so another consumer could dequeue this message");
    

Empfangen und Verarbeiten von Nachrichten

Fügen Sie Code hinzu, um eine Nachricht in der Anwendung zu empfangen und zu verarbeiten.

  1. Suchen Sie die ReceiveMessageAsync-Methode in der Anwendung, und löschen Sie die Zeile, die eine NotImplementedException auslöst.

  2. Fügen Sie am Anfang der ReceiveMessageAsync-Methode die folgenden Codezeilen hinzu, um eine Nachricht aus der Warteschlange abzurufen.

    Response<QueueMessage> response = await queueClient.ReceiveMessageAsync();
    QueueMessage message = response.Value;
    
  3. Fügen Sie die folgenden Codezeilen unterhalb der beiden Zeilen hinzu, die Sie der Methode gerade hinzugefügt haben. Dieser Code gibt einige Eigenschaften der empfangenen Nachricht aus, einschließlich des Textkörpers der unformatierten Nachricht im JSON-Format.

    Console.WriteLine($"Message id    : {message.MessageId}");
    Console.WriteLine($"Inserted on   : {message.InsertedOn}");
    Console.WriteLine($"Message (raw) : {message.Body}");
    
  4. Um den Inhalt der Nachricht in ein Objekt zu deserialisieren, mit dem wir in unserem Code arbeiten können, fügen Sie die Methode ToObjectFromJson zur Eigenschaft Body des Objekts QueueMessage hinzu. Fügen Sie der Methode die folgenden Zeilen hinzu.

    NewsArticle article = message.Body.ToObjectFromJson<NewsArticle>();
    Console.WriteLine("News Article");
    Console.WriteLine($"-  Headline : {article.Headline}");
    Console.WriteLine($"-  Location : {article.Location}");
    
  5. Wenn wir die Nachricht verarbeitet haben, müssen wir sie schließlich aus der Warteschlange löschen, damit sie nicht von anderen Consumern verarbeitet wird. Fügen Sie am Ende der Methode ReceiveMessageAsync den folgenden Code hinzu.

    Console.WriteLine("The processing for this message is just printing it out, so now it will be deleted");
    await queueClient.DeleteMessageAsync(message.MessageId, message.PopReceipt);
    Console.WriteLine($"Message deleted");
    

    Die vollständige Methode sollte wie folgt aussehen:

    static async Task ReceiveMessageAsync(QueueClient queueClient)
    {
        Response<QueueMessage> response = await queueClient.ReceiveMessageAsync();
        QueueMessage message = response.Value;
    
        Console.WriteLine($"Message id    : {message.MessageId}");
        Console.WriteLine($"Inserted on   : {message.InsertedOn}");
        Console.WriteLine($"Message (raw) : {message.Body}");
    
        NewsArticle article = message.Body.ToObjectFromJson<NewsArticle>();
        Console.WriteLine("News Article");
        Console.WriteLine($"-  Headline : {article.Headline}");
        Console.WriteLine($"-  Location : {article.Location}");
    
        Console.WriteLine("The processing for this message is just printing it out, so now it will be deleted");
        await queueClient.DeleteMessageAsync(message.MessageId, message.PopReceipt);
        Console.WriteLine($"Message deleted");
    }
    
  6. Speichern Sie die Datei Program.cs.

Ausführen der Anwendung

Der Code ist nun vollständig. Er kann jetzt Nachrichten senden und abrufen.

  1. Erstellen Sie zunächst die Anwendung.

    dotnet build
    
  2. Führen Sie die Anwendung aus.

    dotnet run
    
  3. Verwenden Sie das Menü, um mit dem Hinzufügen, dem Einsehen und dem Empfangen von Nachrichten in der Warteschlange zu experimentieren. Die Beispielausgabe sollte in etwa wie folgt aussehen.

    What operation would you like to perform?
      1 - Send message
      2 - Peek at the next message
      3 - Receive message
      X - Exit program
    1
    
    Enter headline:
    World leaders to meet at economic summit
    Enter location:
    Paris, France
    Message sent. Message id=8f5b9bc7-3e7f-448b-9787-508636963938  Expiration time=10/14/2021 9:01:58 PM +00:00
    
    What operation would you like to perform?
      1 - Send message
      2 - Peek at the next message
      3 - Receive message
      X - Exit program
    2
    
    Message id  : 8f5b9bc7-3e7f-448b-9787-508636963938
    Inserted on : 10/7/2021 9:01:58 PM +00:00
    We are only peeking at the message, so another consumer could dequeue this message
    What operation would you like to perform?
      1 - Send message
      2 - Peek at the next message
      3 - Receive message
      X - Exit program
    3
    
    Message id    : 8f5b9bc7-3e7f-448b-9787-508636963938
    Inserted on   : 10/7/2021 9:01:58 PM +00:00
    Message (raw) : {"Headline":"World leaders to meet at economic summit","Location":"Paris, France"}
    News Article
    -  Headline : World leaders to meet at economic summit
    -  Location : Paris, France
    The processing for this message is just printing it out, so now it will be deleted
    Message deleted
    What operation would you like to perform?
      1 - Send message
      2 - Peek at the next message
      3 - Receive message
      X - Exit program
    X