Share via


Oktatóanyag: Azure Queue Storage-üzenetsorok használata a .NET-ben

Az Azure Queue Storage felhőalapú üzenetsorokat implementál egy elosztott alkalmazás összetevői közötti kommunikáció engedélyezéséhez. Az egyes üzenetsorok a küldő összetevő által hozzáadható és a fogadó összetevő által feldolgozott üzenetek listáját őrzik meg. Egy üzenetsor esetén az alkalmazás azonnal skálázható az igényeknek megfelelően. Ez a cikk az Azure Queue Storage-üzenetsorok használatának alapvető lépéseit mutatja be.

Eben az oktatóanyagban az alábbiakkal fog megismerkedni:

  • Azure Storage-fiók létrehozása
  • Az alkalmazás létrehozása
  • Az Azure-ügyfélkódtárak hozzáadása
  • Aszinkron kód támogatásának hozzáadása
  • Üzenetsor létrehozása
  • Üzenetek beszúrása üzenetsorba
  • Üzenetek törlése
  • Üres üzenetsor törlése
  • Parancssori argumentumok keresése
  • Készítsen buildet és futtassa az alkalmazást

Előfeltételek

Azure Storage-fiók létrehozása

Először hozzon létre egy Azure Storage-fiókot. A tárfiókok létrehozásának részletes útmutatója: Tárfiók létrehozása. Ez egy külön lépés, amelyet egy ingyenes Azure-fiók létrehozása után hajt végre az előfeltételek között.

Az alkalmazás létrehozása

Hozzon létre egy nevű .NET Core-alkalmazást QueueApp. Az egyszerűség kedvéért ez az alkalmazás üzeneteket küld és fogad az üzenetsoron keresztül.

  1. Egy konzolablakban (például cmd, PowerShell vagy Azure CLI) az dotnet new paranccsal hozzon létre egy új konzolalkalmazást a következő néven QueueApp: . Ez a parancs létrehoz egy egyszerű "hello world" C#-projektet egyetlen nevű forrásfájllal Program.cs.

    dotnet new console -n QueueApp
    
  2. Váltson az újonnan létrehozott QueueApp mappára, és fordítsa le az alkalmazást, hogy ellenőrizhesse, minden rendben van-e.

    cd QueueApp
    
    dotnet build
    

    Az alábbi kimenethez hasonló eredményeknek kell megjelennie:

    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>_
    

Az Azure-ügyfélkódtárak hozzáadása

  1. Adja hozzá az Azure Storage-ügyfélkódtárakat a projekthez az dotnet add package paranccsal.

    Futtassa a következő parancsot a konzolablak projektmappájából.

    dotnet add package Azure.Storage.Queues
    

Add using statements

  1. A projektkönyvtár parancssorából írja be a parancsot code . a Visual Studio Code megnyitásához az aktuális könyvtárban. Hagyja nyitva a parancssori ablakot. Később további parancsok is futtathatók lesznek. Ha a rendszer a létrehozáshoz és a hibakereséshez szükséges C#-eszközök hozzáadását kéri, kattintson az Igen gombra.

  2. Nyissa meg a Program.cs forrásfájlt, és adja hozzá a következő névtereket közvetlenül az using System; utasítás után. Ez az alkalmazás ezekből a névterekből származó típusokat használ az Azure Storage-hoz való csatlakozáshoz és az üzenetsorok kezeléséhez.

    using System.Threading.Tasks;
    using Azure.Storage.Queues;
    using Azure.Storage.Queues.Models;
    
  3. Mentse a Program.cs fájlt.

Aszinkron kód támogatásának hozzáadása

Mivel az alkalmazás felhőalapú erőforrásokat használ, a kód aszinkron módon fut.

  1. Frissítse a metódust az Main aszinkron futtatáshoz. Cserélje le a értéket void egy visszatérési async Task értékre.

    static async Task Main(string[] args)
    
  2. Mentse a Program.cs fájlt.

Üzenetsor létrehozása

Mielőtt hívásokat kezdeményezne az Azure API-kba, le kell szereznie a hitelesítő adatait a Azure Portal.

A hitelesítési adatok másolása az Azure Portalról

Amikor a mintaalkalmazás kérést küld az Azure Storage-nak, azt engedélyezni kell. A kérések engedélyezéséhez adja hozzá a tárfiók hitelesítő adatait az alkalmazáshoz kapcsolati sztring. A tárfiók hitelesítő adatainak megtekintéséhez kövesse az alábbi lépéseket:

  1. Jelentkezzen be az Azure Portalra.

  2. Keresse meg a Storage-fiókját.

  3. A Tárfiók menüpanel Biztonság + hálózatkezelés területén válassza a Hozzáférési kulcsok lehetőséget. Itt megtekintheti a fiók hozzáférési kulcsait és az egyes kulcsok teljes kapcsolati sztring.

    Képernyőkép arról, hogy hol találhatók a hozzáférési kulcs beállításai a Azure Portal

  4. A Hozzáférési kulcsok panelen válassza a Kulcsok megjelenítése lehetőséget.

  5. A key1 szakaszban keresse meg a Kapcsolati sztring értékét. Válassza a Másolás vágólapra ikont a kapcsolati sztring másolásához. A kapcsolati sztring értéket a következő szakaszban fogja hozzáadni egy környezeti változóhoz.

    A kapcsolati sztring az Azure Portalról történő másolását bemutató képernyőkép

A tárolási kapcsolati sztring konfigurálása

A kapcsolati sztring másolása után írja be egy új környezeti változóba az alkalmazást futtató helyi gépen. A környezeti változó megadásához nyisson meg egy konzolablakot, és kövesse az operációs rendszerének megfelelő utasításokat. Cserélje le a elemet <yourconnectionstring> a tényleges kapcsolati sztring.

setx AZURE_STORAGE_CONNECTION_STRING "<yourconnectionstring>"

Miután hozzáadta a környezeti változót a Windowsban, el kell indítania a parancsablak új példányát.

Programok újraindítása

A környezeti változó hozzáadása után indítsa újra azokat a futó programokat, amelyeknek be kell olvasniuk a környezeti változót. A folytatás előtt például indítsa újra a fejlesztési környezetet vagy a szerkesztőt.

A kapcsolati sztring hozzáadása az alkalmazáshoz

Adja hozzá a kapcsolati sztring az alkalmazáshoz, hogy hozzáférhessen a tárfiókhoz.

  1. Váltson vissza a Visual Studio Code-ra.

  2. A metódusban Main cserélje le a Console.WriteLine("Hello, World"); kódot a következő sorra, amely lekéri az kapcsolati sztring a környezeti változóból.

    string connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING");
    
  3. Adja hozzá a következő kódot Main egy üzenetsor-objektum létrehozásához, amelyet a rendszer később továbbít a küldési és fogadási metódusokba.

    QueueClient queue = new QueueClient(connectionString, "mystoragequeue");
    
  4. Mentse a fájlt.

Üzenetek beszúrása az üzenetsorba

Hozzon létre egy új metódust, amellyel üzenetet küldhet az üzenetsorba.

  1. Adja hozzá a következő InsertMessageAsync metódust az Program osztályhoz.

    Ez a metódus egy üzenetsor-referenciát ad át. Ha még nem létezik, új üzenetsor jön létre a meghívásával CreateIfNotExistsAsync. Ezután a meghívásával SendMessageAsynchozzáadja a newMessage elemet az üzenetsorhoz.

    static async Task InsertMessageAsync(QueueClient theQueue, string newMessage)
    {
        if (null != await theQueue.CreateIfNotExistsAsync())
        {
            Console.WriteLine("The queue was created.");
        }
    
        await theQueue.SendMessageAsync(newMessage);
    }
    
  2. Választható: Alapértelmezés szerint egy üzenet élettartamának maximális időtartama hét napra van állítva. Bármilyen pozitív számot megadhat az üzenet élettartamához. Az alábbi kódrészlet olyan üzenetet ad hozzá, amely soha nem jár le.

    Ha olyan üzenetet szeretne hozzáadni, amely nem jár le, használja Timespan.FromSeconds(-1) a következő hívását SendMessageAsync: .

    await theQueue.SendMessageAsync(newMessage, default, TimeSpan.FromSeconds(-1), default);
    
  3. Mentse a fájlt.

Az üzenetsor-üzeneteknek UTF-8 kódolást használó XML-kéréssel kompatibilis formátumban kell lenniük. Az üzenetek mérete legfeljebb 64 KB lehet. Ha egy üzenet bináris adatokat tartalmaz, a Base64 kódolja az üzenetet.

Üzenetek törlése

Hozzon létre egy új metódust, amellyel lekérhet egy üzenetet az üzenetsorból. Az üzenet sikeres fogadása után fontos törölni az üzenetsorból, hogy ne dolgozza fel többször.

  1. Adjon hozzá egy nevű RetrieveNextMessageAsync új metódust az Program osztályhoz.

    Ez a metódus egy üzenetet fogad az üzenetsorból a meghívásával ReceiveMessagesAsync, és 1 átadja az első paramétert, hogy csak a következő üzenetet kérje le az üzenetsorban. Az üzenet fogadása után törölje azt az üzenetsorból a meghívásával DeleteMessageAsync.

    Ha a v12 előtti SDK-verzióval küld üzenetet az üzenetsorba, az automatikusan Base64-kódolású lesz. A 12-től kezdődően ez a funkció el lett távolítva. Ha egy üzenetet a v12 SDK használatával kér le, az nem lesz automatikusan Base64-dekódolva. A tartalmat explicit módon Base64-decode-nak kell lennie.

    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. Mentse a fájlt.

Üres üzenetsor törlése

A projekt végén ajánlott megállapítani, hogy szüksége van-e még a létrehozott erőforrásokra. A továbbra is futó erőforrások költségekkel járhatnak. Ha az üzenetsor létezik, de üres, kérdezze meg a felhasználót, hogy szeretné-e törölni.

  1. Bontsa ki a RetrieveNextMessageAsync metódust az üres üzenetsor törlésére vonatkozó kérdés belefoglalásához.

    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. Mentse a fájlt.

Parancssori argumentumok keresése

Ha az alkalmazásnak vannak parancssori argumentumai, feltételezzük, hogy az üzenetsorhoz hozzáadandó üzenet. Sztring létrehozásához kapcsolja össze az argumentumokat. Adja hozzá ezt a sztringet az üzenetsorhoz a InsertMessageAsync korábban hozzáadott metódus meghívásával.

Ha nincsenek parancssori argumentumok, próbáljon meg lekérni egy műveletet. Hívja meg a metódust RetrieveNextMessageAsync az üzenetsor következő üzenetének lekéréséhez.

Végül várja meg a felhasználói bevitelt, mielőtt a meghívásával Console.ReadLinekilép.

  1. Bontsa ki a metódust Main a parancssori argumentumok kereséséhez, és várja meg a felhasználói bevitelt.

    static async Task Main(string[] args)
    {
        string connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING");
    
        QueueClient queue = new QueueClient(connectionString, "mystoragequeue");
    
        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. Mentse a fájlt.

Teljes kód

Itt látható a projekt teljes kódlistázása.

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

namespace QueueApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
            string connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING");

            QueueClient queue = new QueueClient(connectionString, "mystoragequeue");

            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.";
            }
        }
    }
}

Készítsen buildet és futtassa az alkalmazást

  1. A projekt létrehozásához futtassa a következő dotnet parancsot a projekt könyvtárának parancssorából.

    dotnet build
    
  2. A projekt sikeres buildelése után futtassa a következő parancsot az első üzenet üzenetsorhoz való hozzáadásához.

    dotnet run First queue message
    

    A következő kimenetnek kell megjelennie:

    C:\Tutorials\QueueApp>dotnet run First queue message
    The queue was created.
    Sent: First queue message
    Press Enter..._
    
  3. Futtassa az alkalmazást parancssori argumentumok nélkül az üzenetsor első üzenetének fogadásához és eltávolításához.

    dotnet run
    
  4. Folytassa az alkalmazás futtatását, amíg el nem távolítja az összes üzenetet. Ha még egyszer futtatja, megjelenik egy üzenet, amely szerint az üzenetsor üres, és egy üzenetsor törlésére vonatkozó üzenet jelenik meg.

    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>_
    

További lépések

Ez az oktatóanyag bemutatta, hogyan végezheti el az alábbi műveleteket:

  1. Üzenetsor létrehozása
  2. Üzenetek hozzáadása és eltávolítása üzenetsorból
  3. Azure Queue Storage-üzenetsor törlése

További információért tekintse meg az Azure Queue Storage rövid útmutatóit.

Az elavult .NET-verziójú 11.x SDK-kkal kapcsolatos kódmintákért lásd: Kódminták a .NET 11.x verziójával.