Dela via


Självstudie: Arbeta med Azure Queue Storage-köer i .NET

Azure Queue Storage implementerar molnbaserade köer för att möjliggöra kommunikation mellan komponenter i ett distribuerat program. Varje kö har en lista över meddelanden som kan läggas till av en avsändarkomponent och bearbetas av en mottagarkomponent. Med en kö kan programmet skalas omedelbart för att möta efterfrågan. Den här artikeln visar de grundläggande stegen för att arbeta med en Azure Queue Storage-kö.

I den här självstudien lär du dig att:

  • Skapa ett Azure Storage-konto
  • Skapa appen
  • Lägga till Azure-klientbiblioteken
  • Lägga till stöd för asynkron kod
  • Skapa en kö
  • Infoga meddelanden i en kö
  • Avqueue-meddelanden
  • Ta bort en tom kö
  • Sök efter kommandoradsargument
  • Kompilera och köra appen

Förutsättningar

Skapa ett Azure Storage-konto

  1. Skapa först ett Azure Storage-konto.

    En stegvis guide för att skapa ett lagringskonto finns i Skapa ett lagringskonto. Det här är ett separat steg som du utför när du har skapat ett kostnadsfritt Azure-konto i förhandskraven.

  2. Kontrollera att ditt användarkonto har tilldelats rollen Lagringsködatadeltagare , omfångsbegränsad till lagringskontot, den överordnade resursgruppen eller prenumerationen. Se Autentisera till Azure.

Skapa appen

Skapa ett .NET Core-program med namnet QueueApp. För enkelhetens skull skickar och tar den här appen emot meddelanden via kön.

  1. I ett konsolfönster (till exempel cmd, PowerShell eller Azure CLI) använder du dotnet new kommandot för att skapa en ny konsolapp med namnet QueueApp. Det här kommandot skapar ett enkelt "hello world"-C#-projekt med en enda källfil med namnet Program.cs.

    dotnet new console -n QueueApp
    
  2. Växla till den nya mappen QueueApp och kompilera appen så att du ser att allting fungerar.

    cd QueueApp
    
    dotnet build
    

    Du bör se resultat som liknar följande utdata:

    C:\Tutorials>dotnet new console -n QueueApp
    The template "Console Application" was created successfully.
    
    Processing post-creation actions...
    Running 'dotnet restore' on QueueApp\QueueApp.csproj...
      Restore completed in 155.63 ms for C:\Tutorials\QueueApp\QueueApp.csproj.
    
    Restore succeeded.
    
    C:\Tutorials>cd QueueApp
    
    C:\Tutorials\QueueApp>dotnet build
    Microsoft (R) Build Engine version 16.0.450+ga8dc7f1d34 for .NET Core
    Copyright (C) Microsoft Corporation. All rights reserved.
    
      Restore completed in 40.87 ms for C:\Tutorials\QueueApp\QueueApp.csproj.
      QueueApp -> C:\Tutorials\QueueApp\bin\Debug\netcoreapp3.1\QueueApp.dll
    
    Build succeeded.
        0 Warning(s)
        0 Error(s)
    
    Time Elapsed 00:00:02.40
    
    C:\Tutorials\QueueApp>_
    

Lägga till Azure-klientbiblioteken

  1. Lägg till Azure Storage-klientbiblioteken i projektet med hjälp dotnet add package av kommandot .

    Kör följande kommando från projektmappen i konsolfönstret.

    dotnet add package Azure.Storage.Queues
    

Lägg till using-instruktioner

  1. Från kommandoraden i projektkatalogen skriver du code . för att öppna Visual Studio Code i den aktuella katalogen. Håll kommandoradsfönstret öppet. Det kommer att finnas fler kommandon att köra senare. Om du uppmanas att lägga till C#-tillgångar som krävs för att skapa och felsöka klickar du på knappen Ja .

  2. Program.cs Öppna källfilen och lägg till följande namnområden direkt efter -instruktionenusing System;. Den här appen använder typer från dessa namnområden för att ansluta till Azure Storage och arbeta med köer.

    using System.Threading.Tasks;
    using Azure.Storage.Queues;
    using Azure.Storage.Queues.Models;
    
  3. Spara filen Program.cs.

Lägga till stöd för asynkron kod

Eftersom appen använder molnresurser körs koden asynkront.

  1. Uppdatera metoden så att den Main körs asynkront. Ersätt void med ett async Task returvärde.

    static async Task Main(string[] args)
    
  2. Spara filen Program.cs.

Skapa en kö

Innan du gör några anrop till Azure-API:er måste du kontrollera att du är autentiserad med samma Microsoft Entra-konto som du tilldelade rollen till. När du har autentiserats kan du skapa och auktorisera ett QueueClient objekt med hjälp DefaultAzureCredential av för att komma åt ködata i lagringskontot. DefaultAzureCredential identifierar automatiskt och använder det konto som du loggade in på. Information om hur du loggar in och sedan skapar ett QueueClient objekt finns i Auktorisera åtkomst och skapa ett klientobjekt.

Infoga meddelanden i kön

Skapa en ny metod för att skicka ett meddelande till kön.

  1. Lägg till följande InsertMessageAsync metod i klassen Program .

    Den här metoden skickas en köreferens. En ny kö skapas, om den inte redan finns, genom att anropa CreateIfNotExistsAsync. Sedan läggs newMessage kön till genom att anropa SendMessageAsync.

    static async Task InsertMessageAsync(QueueClient theQueue, string newMessage)
    {
        if (null != await theQueue.CreateIfNotExistsAsync())
        {
            Console.WriteLine("The queue was created.");
        }
    
        await theQueue.SendMessageAsync(newMessage);
    }
    
  2. Valfritt: Som standard är den maximala tidsgränsen för ett meddelande inställd på sju dagar. Du kan ange ett positivt tal för meddelandet time-to-live. Följande kodfragment lägger till ett meddelande som aldrig upphör att gälla.

    Om du vill lägga till ett meddelande som inte upphör att gälla använder du Timespan.FromSeconds(-1) i anropet till SendMessageAsync.

    await theQueue.SendMessageAsync(newMessage, default, TimeSpan.FromSeconds(-1), default);
    
  3. Spara filen.

Ett kömeddelande måste vara i ett format som är kompatibelt med en XML-begäran med UTF-8-kodning. Ett meddelande kan vara upp till 64 kB stort. Om ett meddelande innehåller binära data kodar Base64-meddelandet.

Avqueue-meddelanden

Skapa en ny metod för att hämta ett meddelande från kön. När meddelandet har tagits emot är det viktigt att ta bort det från kön så att det inte bearbetas mer än en gång.

  1. Lägg till en ny metod med namnet RetrieveNextMessageAsync i din Program klass.

    Den här metoden tar emot ett meddelande från kön genom att anropa ReceiveMessagesAsyncoch skickar 1 in den första parametern för att endast hämta nästa meddelande i kön. När meddelandet har tagits emot tar du bort det från kön genom att anropa DeleteMessageAsync.

    När ett meddelande skickas till kön med en version av SDK:et före v12, så är det automatiskt Base64-kodat. Från och med v12 togs den funktionen bort. När du hämtar ett meddelande med v12 SDK avkodas det inte automatiskt. Du måste uttryckligen base64-avkoda innehållet själv.

    static async Task<string> RetrieveNextMessageAsync(QueueClient theQueue)
    {
        if (await theQueue.ExistsAsync())
        {
            QueueProperties properties = await theQueue.GetPropertiesAsync();
    
            if (properties.ApproximateMessagesCount > 0)
            {
                QueueMessage[] retrievedMessage = await theQueue.ReceiveMessagesAsync(1);
                string theMessage = retrievedMessage[0].Body.ToString();
                await theQueue.DeleteMessageAsync(retrievedMessage[0].MessageId, retrievedMessage[0].PopReceipt);
                return theMessage;
            }
    
            return null;
        }
    
        return null;
    }
    
  2. Spara filen.

Ta bort en tom kö

Det är bästa praxis i slutet av ett projekt att identifiera om du fortfarande behöver de resurser som du har skapat. Resurser som fortsätter att köras kostar pengar. Om kön finns men är tom frågar du användaren om de vill ta bort den.

  1. RetrieveNextMessageAsync Expandera metoden för att inkludera en uppmaning om att ta bort den tomma kön.

    static async Task<string> RetrieveNextMessageAsync(QueueClient theQueue)
    {
        if (await theQueue.ExistsAsync())
        {
            QueueProperties properties = await theQueue.GetPropertiesAsync();
    
            if (properties.ApproximateMessagesCount > 0)
            {
                QueueMessage[] retrievedMessage = await theQueue.ReceiveMessagesAsync(1);
                string theMessage = retrievedMessage[0].Body.ToString();
                await theQueue.DeleteMessageAsync(retrievedMessage[0].MessageId, retrievedMessage[0].PopReceipt);
                return theMessage;
            }
            else
            {
                Console.Write("The queue is empty. Attempt to delete it? (Y/N) ");
                string response = Console.ReadLine();
    
                if (response.ToUpper() == "Y")
                {
                    await theQueue.DeleteIfExistsAsync();
                    return "The queue was deleted.";
                }
                else
                {
                    return "The queue was not deleted.";
                }
            }
        }
        else
        {
            return "The queue does not exist. Add a message to the command line to create the queue and store the message.";
        }
    }
    
  2. Spara filen.

Sök efter kommandoradsargument

Om det finns kommandoradsargument som skickas till appen antar du att de är ett meddelande som ska läggas till i kön. Koppla ihop argumenten för att skapa en sträng. Lägg till den här strängen i meddelandekön genom att anropa metoden InsertMessageAsync som vi lade till tidigare.

Om det inte finns några kommandoradsargument kan du försöka med en hämtningsåtgärd. RetrieveNextMessageAsync Anropa metoden för att hämta nästa meddelande i kön.

Vänta slutligen på användarindata innan du avslutar genom att anropa Console.ReadLine.

  1. Main Expandera metoden för att söka efter kommandoradsargument och vänta på användarindata. I kodfragmentet nedan ska du ersätta {storageAccountName} platshållaren med namnet på ditt lagringskonto.

    static async Task Main(string[] args)
    {
       QueueClient queue = new QueueClient(
          new Uri($"https://{storageAccountName}.queue.core.windows.net/mystoragequeue"),
          new DefaultAzureCredential());
    
       if (args.Length > 0)
       {
          string value = String.Join(" ", args);
          await InsertMessageAsync(queue, value);
          Console.WriteLine($"Sent: {value}");
       }
       else
       {
          string value = await RetrieveNextMessageAsync(queue);
          Console.WriteLine($"Received: {value}");
       }
    
       Console.Write("Press Enter...");
       Console.ReadLine();
    }
    
  2. Spara filen.

Fullständig kod

Här är den fullständiga kodlistan för det här projektet.

using System;
using System.Threading.Tasks;
using Azure.Storage.Queues;
using Azure.Storage.Queues.Models;
using Azure.Identity;

namespace QueueApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
            QueueClient queue = new QueueClient(
               new Uri($"https://{storageAccountName}.queue.core.windows.net/mystoragequeue"),
               new DefaultAzureCredential());

            if (args.Length > 0)
            {
                string value = String.Join(" ", args);
                await InsertMessageAsync(queue, value);
                Console.WriteLine($"Sent: {value}");
            }
            else
            {
                string value = await RetrieveNextMessageAsync(queue);
                Console.WriteLine($"Received: {value}");
            }

            Console.Write("Press Enter...");
            Console.ReadLine();
        }

        static async Task InsertMessageAsync(QueueClient theQueue, string newMessage)
        {
            if (null != await theQueue.CreateIfNotExistsAsync())
            {
                Console.WriteLine("The queue was created.");
            }

            await theQueue.SendMessageAsync(newMessage);
        }

        static async Task<string> RetrieveNextMessageAsync(QueueClient theQueue)
        {
            if (await theQueue.ExistsAsync())
            {
                QueueProperties properties = await theQueue.GetPropertiesAsync();

                if (properties.ApproximateMessagesCount > 0)
                {
                    QueueMessage[] retrievedMessage = await theQueue.ReceiveMessagesAsync(1);
                    string theMessage = retrievedMessage[0].Body.ToString();
                    await theQueue.DeleteMessageAsync(retrievedMessage[0].MessageId, retrievedMessage[0].PopReceipt);
                    return theMessage;
                }
                else
                {
                    Console.Write("The queue is empty. Attempt to delete it? (Y/N) ");
                    string response = Console.ReadLine();

                    if (response.ToUpper() == "Y")
                    {
                        await theQueue.DeleteIfExistsAsync();
                        return "The queue was deleted.";
                    }
                    else
                    {
                        return "The queue was not deleted.";
                    }
                }
            }
            else
            {
                return "The queue does not exist. Add a message to the command line to create the queue and store the message.";
            }
        }
    }
}

Kompilera och köra appen

  1. Från kommandoraden i projektkatalogen kör du följande dotnet-kommando för att skapa projektet.

    dotnet build
    
  2. När projektet har skapats kör du följande kommando för att lägga till det första meddelandet i kön.

    dotnet run First queue message
    

    Du bör se dessa utdata:

    C:\Tutorials\QueueApp>dotnet run First queue message
    The queue was created.
    Sent: First queue message
    Press Enter..._
    
  3. Kör appen utan kommandoradsargument för att ta emot och ta bort det första meddelandet i kön.

    dotnet run
    
  4. Fortsätt att köra appen tills alla meddelanden har tagits bort. Om du kör den en gång till får du ett meddelande om att kön är tom och en uppmaning om att ta bort kön.

    C:\Tutorials\QueueApp>dotnet run First queue message
    The queue was created.
    Sent: First queue message
    Press Enter...
    
    C:\Tutorials\QueueApp>dotnet run Second queue message
    Sent: Second queue message
    Press Enter...
    
    C:\Tutorials\QueueApp>dotnet run Third queue message
    Sent: Third queue message
    Press Enter...
    
    C:\Tutorials\QueueApp>dotnet run
    Received: First queue message
    Press Enter...
    
    C:\Tutorials\QueueApp>dotnet run
    Received: Second queue message
    Press Enter...
    
    C:\Tutorials\QueueApp>dotnet run
    Received: Third queue message
    Press Enter...
    
    C:\Tutorials\QueueApp>dotnet run
    The queue is empty. Attempt to delete it? (Y/N) Y
    Received: The queue was deleted.
    Press Enter...
    
    C:\Tutorials\QueueApp>_
    

Nästa steg

I den här självstudiekursen lärde du dig att:

  1. Skapa en kö
  2. Lägga till och ta bort meddelanden från en kö
  3. Ta bort en Azure Queue Storage-kö

Mer information finns i snabbstarterna för Azure Queue Storage.

Relaterade kodexempel med inaktuella .NET version 11.x SDK:er finns i Kodexempel med .NET version 11.x.