Ejercicio: Recuperación de un mensaje de la cola

Completado

Vamos a finalizar la aplicación escribiendo código para leer el siguiente mensaje de la cola, procesarlo y, después, eliminarlo de la cola.

Colocaremos el código en la aplicación y la ejecutaremos cuando un usuario seleccione los elementos de menú adecuados. En un escenario real, este código se colocaría en su propia aplicación dedicada a recibir y procesar mensajes.

Inspección del mensaje siguiente

Ahora se agregará un método nuevo que inspecciona el siguiente mensaje de la cola.

  1. Abra el archivo de origen Program.cs en el editor.

  2. Busque el método PeekMessageAsync en la aplicación y elimine la línea que inicia una excepción NotImplementedException.

  3. Agregue el siguiente código al método. Este código inspecciona el siguiente mensaje de la cola e imprime información sobre él.

            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");
    

Recepción y procesamiento de mensajes

Agregue el código para recibir y procesar un mensaje en la aplicación.

  1. Busque el método ReceiveMessageAsync en la aplicación y elimine la línea que inicia una excepción NotImplementedException.

  2. En la parte superior del método ReceiveMessageAsync, agregue las siguientes líneas de código para obtener un mensaje de la cola.

    Response<QueueMessage> response = await queueClient.ReceiveMessageAsync();
    QueueMessage message = response.Value;
    
  3. Agregue al método las siguientes líneas de código, debajo de las dos anteriores. Este código imprime algunas propiedades sobre el mensaje recibido, incluido el cuerpo del mensaje sin formato en formato JSON.

    Console.WriteLine($"Message id    : {message.MessageId}");
    Console.WriteLine($"Inserted on   : {message.InsertedOn}");
    Console.WriteLine($"Message (raw) : {message.Body}");
    
  4. Para deserializar el contenido del mensaje en un objeto con el que se pueda trabajar en el código, agregue el método ToObjectFromJson en la propiedad Body del objeto QueueMessage. Agregue las siguientes líneas al método.

    NewsArticle article = message.Body.ToObjectFromJson<NewsArticle>();
    Console.WriteLine("News Article");
    Console.WriteLine($"-  Headline : {article.Headline}");
    Console.WriteLine($"-  Location : {article.Location}");
    
  5. Por último, cuando se haya procesado el mensaje, es necesario eliminarlo de la cola para que no lo procese ningún otro consumidor. Agregue el código siguiente al final del método ReceiveMessageAsync.

    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");
    

    Este es el aspecto que debe tener el método completado:

    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. Guarde el archivo Program.cs.

Ejecución de la aplicación

El código ya está completo. Ahora puede enviar y recuperar mensajes.

  1. En primer lugar, compile la aplicación.

    dotnet build
    
  2. Ejecute la aplicación.

    dotnet run
    
  3. Use el menú para experimentar con las tareas de adición de mensajes a la cola, de inspección y de recepción. La salida de ejemplo debería ser similar a la siguiente.

    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