Zelfstudie: Werken met Azure Queue Storage-wachtrijen in .NET
Met Azure Queue Storage worden cloudwachtrijen geïmplementeerd om communicatie tussen onderdelen van een gedistribueerde toepassing mogelijk te maken. Elke wachtrij houdt een lijst bij van berichten die kunnen worden toegevoegd door een afzenderonderdeel en kunnen worden verwerkt door een ontvangeronderdeel. Met een wachtrij kan uw toepassing onmiddellijk worden geschaald om aan de vraag te voldoen. In dit artikel worden de basisstappen beschreven voor het werken met een Azure Queue Storage-wachtrij.
In deze zelfstudie leert u het volgende:
- Een Azure Storage-account maken
- De app maken
- De Azure-clientbibliotheken toevoegen
- Ondersteuning voor asynchrone code toevoegen
- Een wachtrij maken
- Berichten in een wachtrij invoegen
- Bericht uit een wachtrij verwijderen
- Een lege wachtrij verwijderen
- Controleren op opdrachtregelargumenten
- De app bouwen en uitvoeren
Vereisten
- Download een gratis kopie van de Visual Studio Code-editor voor meerdere platforms.
- Download en installeer de .NET Core SDK versie 3.1 of hoger.
- Als u momenteel geen abonnement op Azure hebt, maakt u een gratis account voordat u begint.
Een Azure Storage-account maken
Maak eerst een Azure-opslagaccount. Raadpleeg Een opslagaccount maken voor een stapsgewijze handleiding voor het maken van een opslagaccount. Dit is een afzonderlijke stap die u uitvoert nadat u bij de vereisten een gratis Azure-account hebt gemaakt.
De app maken
Maak een .NET Core-toepassing met de naam QueueApp
. Voor het gemak zal deze app zowel berichten verzenden als ontvangen via de wachtrij.
Gebruik in een consolevenster (zoals cmd, PowerShell of Azure CLI) de opdracht
dotnet new
om een nieuwe console-app te maken met de naamQueueApp
. Met deze opdracht maakt u een eenvoudig Hallo wereld-C#-project met één bronbestand genaamd:Program.cs
.dotnet new console -n QueueApp
Schakel over naar de zojuist gemaakt map
QueueApp
en bouw de app om te controleren of alles in orde is.cd QueueApp
dotnet build
U ziet als het goed is resultaten die vergelijkbaar zijn met de volgende uitvoer:
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>_
De Azure-clientbibliotheken toevoegen
Voeg de Azure Storage-clientbibliotheken toe aan het project met behulp van de opdracht
dotnet add package
.Voer de volgende opdracht uit vanuit de projectmap in het consolevenster.
dotnet add package Azure.Storage.Queues
Instructies toevoegen
Ga naar de opdrachtregel in de projectmap en typ
code .
om Visual Studio Code in de huidige map te openen. Houd het opdrachtregelvenster geopend. U gaat later meer opdrachten uitvoeren. Als u wordt gevraagd om C#-assets toe te voegen die vereist zijn voor het maken en het opsporen van fouten, klikt u op de knop Ja.Open het bronbestand
Program.cs
en voeg de volgende naamruimten toe na de instructieusing System;
. Deze app gebruikt typen uit deze naamruimten om verbinding met Azure Storage te maken en met wachtrijen te werken.using System.Threading.Tasks; using Azure.Storage.Queues; using Azure.Storage.Queues.Models;
Sla het bestand
Program.cs
op.
Ondersteuning voor asynchrone code toevoegen
Omdat de app gebruikmaakt van cloudresources, wordt de code asynchroon uitgevoerd.
Werk de methode
Main
bij om asynchroon te worden uitgevoerd. Vervangvoid
door een retourwaarde voor eenasync Task
.static async Task Main(string[] args)
Sla het bestand
Program.cs
op.
Een wachtrij maken
Voordat u aanroepen naar Azure API's kunt uitvoeren, moet u uw referenties ophalen uit de Azure-portal.
Kopieer uw referenties van de Azure Portal
Wanneer met de voorbeeldtoepassing een aanvraag wordt ingediend bij Azure Storage, moet deze aanvraag worden geautoriseerd. Om een aanvraag te autoriseren voegt u de referenties van uw opslagaccount toe als een verbindingsreeks. Voer de volgende stappen uit om de referenties van uw opslagaccount weer te geven:
Meld u aan bij Azure Portal.
Zoek uw opslagaccount.
Selecteer in het menuvenster opslagaccount onder Beveiliging en netwerken de optie Toegangssleutels. Hier kunt u de toegangssleutels voor het account en de volledige connection string voor elke sleutel bekijken.
Selecteer in het deelvenster Toegangssleutelsde optie Sleutels weergeven.
Zoek in de sectie key1 de waarde van de verbindingsreeks . Selecteer het pictogram Kopiëren naar klembord om de connection string te kopiëren. In de volgende sectie voegt u de connection string-waarde toe aan een omgevingsvariabele.
De opslagverbindingsreeks configureren
Nadat u de connection string hebt gekopieerd, schrijft u deze naar een nieuwe omgevingsvariabele op de lokale computer waarop de toepassing wordt uitgevoerd. Als u de omgevingsvariabele wilt instellen, opent u een consolevenster en volgt u de aanwijzingen voor uw besturingssysteem. Vervang <yourconnectionstring>
door de feitelijke verbindingsreeks.
setx AZURE_STORAGE_CONNECTION_STRING "<yourconnectionstring>"
Nadat u de omgevingsvariabele in Windows hebt toegevoegd, moet u een nieuw exemplaar van het opdrachtvenster starten.
Programma's opnieuw opstarten
Nadat u de omgevingsvariabele hebt toegevoegd, start u actieve programma's die de omgevingsvariabele moeten lezen, opnieuw. Start bijvoorbeeld uw ontwikkelomgeving of editor opnieuw voordat u doorgaat.
De verbindingsreeks aan de app toevoegen
Voeg de verbindingsreeks toe aan de app, zodat deze toegang krijgt tot het opslagaccount.
Ga terug naar Visual Studio Code.
Vervang in de methode
Main
de codeConsole.WriteLine("Hello, World");
door de volgende regel waarmee de verbindingstekenreeks wordt opgehaald uit de omgevingsvariabele.string connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING");
Voeg de volgende code toe aan
Main
om een wachtrij-object te maken, dat later wordt doorgegeven aan de methoden voor verzenden en ontvangen.QueueClient queue = new QueueClient(connectionString, "mystoragequeue");
Sla het bestand op.
Berichten in de wachtrij invoegen
Maak een nieuwe methode om een bericht naar de wachtrij te verzenden.
Voeg in volgende methode
InsertMessageAsync
toe aan deProgram
-klasse.Met deze methode wordt een wachtrijverwijzing doorgegeven. Er wordt een nieuwe wachtrij gemaakt, als deze nog niet bestaat, door
CreateIfNotExistsAsync
aan te roepen. Vervolgens wordt denewMessage
toegevoegd aan de wachtrij doorSendMessageAsync
aan te roepen.static async Task InsertMessageAsync(QueueClient theQueue, string newMessage) { if (null != await theQueue.CreateIfNotExistsAsync()) { Console.WriteLine("The queue was created."); } await theQueue.SendMessageAsync(newMessage); }
Optioneel: Standaard is de maximale time-to-live voor een bericht ingesteld op zeven dagen. U kunt elk willekeurig positief getal opgeven voor de time-to-live van het bericht. Met het volgende codefragment wordt een bericht toegevoegd dat nooit verloopt.
Als u een bericht wilt toevoegen dat niet verloopt, gebruikt u
Timespan.FromSeconds(-1)
in uw aanroep naarSendMessageAsync
.await theQueue.SendMessageAsync(newMessage, default, TimeSpan.FromSeconds(-1), default);
Sla het bestand op.
Een wachtrijbericht moet een indeling hebben die compatibel is met een XML-aanvraag met UTF-8-codering. Een bericht kan maximaal 64 KB groot zijn. Als een bericht binaire gegevens bevat, moet u het bericht base64-coderen.
Bericht uit een wachtrij verwijderen
Maak een nieuwe methode om een bericht uit de wachtrij op te halen. Zodra het bericht is ontvangen, is het belangrijk dat het uit de wachtrij wordt verwijderd zodat het niet meer dan één keer wordt verwerkt.
Voeg een nieuwe methode met de naam
RetrieveNextMessageAsync
toe aan uw klasseProgram
.Met deze methode wordt een bericht uit de wachtrij ontvangen door het aanroepen van
ReceiveMessagesAsync
, waarbij1
in de eerste parameter wordt doorgegeven om alleen het volgende bericht in de wachtrij op te halen. Nadat het bericht is ontvangen, verwijdert u het uit de wachtrij doorDeleteMessageAsync
aan te roepen.Wanneer een bericht wordt verzonden naar de wachtrij met een SDK-versie van vóór V12, wordt het automatisch met base64 gecodeerd. Vanaf V12 is deze functionaliteit verwijderd. Wanneer u een bericht ophaalt met behulp van SDK v12, wordt het niet automatisch met base64 gedecodeerd. U moet de inhoud zelf expliciet decoderen met base64.
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; }
Sla het bestand op.
Een lege wachtrij verwijderen
Het is een best practice om aan het einde van een project te bepalen of u nog steeds de resources nodig hebt die u hebt gemaakt. Resources die actief blijven, kunnen u geld kosten. Als de wachtrij bestaat, maar leeg is, vraagt u de gebruiker of deze moet worden verwijderd.
Vouw de methode
RetrieveNextMessageAsync
uit om een prompt op te nemen voor het verwijderen van de lege wachtrij.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."; } }
Sla het bestand op.
Controleren op opdrachtregelargumenten
Als er opdrachtregelargumenten worden doorgegeven aan de app, wordt ervan uitgegaan dat er een bericht wordt toegevoegd aan de wachtrij. Voeg de argumenten samen om een tekenreeks te maken. Voeg deze tekenreeks toe aan de berichtenwachtrij door de methode InsertMessageAsync
aan te roepen die u eerder hebt toegevoegd.
Als er geen opdrachtregelargumenten zijn, probeert u een ophaalbewerking uit te voeren. Roep de methode RetrieveNextMessageAsync
aan om het volgende bericht in de wachtrij op te halen.
Wacht ten slotte op invoer van de gebruiker voordat u afsluit met het aanroepen van Console.ReadLine
.
Vouw de methode
Main
uit om te controleren op opdrachtregelargumenten en te wachten op invoer van de gebruiker.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(); }
Sla het bestand op.
Volledige code
Dit is de volledige codelijst voor dit project.
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.";
}
}
}
}
De app bouwen en uitvoeren
Voer vanaf de opdrachtregel in de projectmap de volgende DotNet-opdracht uit om het project te bouwen.
dotnet build
Nadat het project is gebouwd, voert u de volgende opdracht uit om het eerste bericht toe te voegen aan de wachtrij.
dotnet run First queue message
U hoort deze uitvoer te zien:
C:\Tutorials\QueueApp>dotnet run First queue message The queue was created. Sent: First queue message Press Enter..._
Voer de app uit zonder opdrachtregelargumenten om het eerste bericht in de wachtrij te ontvangen en te verwijderen.
dotnet run
Ga door met het uitvoeren van de app totdat alle berichten zijn verwijderd. Als u de app nog een keer uitvoert, ontvangt u een bericht dat de wachtrij leeg is en wordt u gevraagd om de wachtrij te verwijderen.
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>_
Volgende stappen
In deze zelfstudie heeft u het volgende geleerd:
- Een wachtrij maken
- Berichten toevoegen aan en verwijderen uit een wachtrij
- Een Azure Queue Storage-wachtrij verwijderen
Bekijk de Azure Queue Storage-quickstarts voor meer informatie.