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
- Ontwikkel de app en voer deze uit
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.
Zorg ervoor dat aan uw gebruikersaccount de rol Inzender voor opslagwachtrijgegevens is toegewezen, die is afgestemd op het opslagaccount, de bovenliggende resourcegroep of het abonnement. Zie Verifiëren bij Azure.
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
QueueApp
-map en bouw de app om te controleren of alles goed 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
Program.cs
bronbestand en voeg de volgende naamruimten toe direct na deusing System;
instructie. 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
Main
methode bij om asynchroon uit te voeren. Vervang doorvoid
eenasync Task
retourwaarde.static async Task Main(string[] args)
Sla het bestand
Program.cs
op.
Een wachtrij maken
Voordat u aanroepen naar Azure-API's uitvoert, moet u ervoor zorgen dat u bent geverifieerd met hetzelfde Microsoft Entra-account waaraan u de rol hebt toegewezen. Nadat u bent geverifieerd, kunt u een QueueClient
object maken en autoriseren met behulp van DefaultAzureCredential
toegang tot wachtrijgegevens in het opslagaccount. DefaultAzureCredential
detecteert en gebruikt automatisch het account waarin u zich hebt aangemeld. Zie Toegang autoriseren en een clientobject maken voor meer informatie over aanmelden en vervolgens een QueueClient
object maken.
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: de maximale time-to-live voor een bericht is standaard 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
Timespan.FromSeconds(-1)
u 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 toe die aan uw klas wordt aangeroepen
RetrieveNextMessageAsync
Program
.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
RetrieveNextMessageAsync
methode uit om een prompt op te nemen om de lege wachtrij te verwijderen.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 InsertMessageAsync
methode aan te roepen die we eerder hebben toegevoegd.
Als er geen opdrachtregelargumenten zijn, probeert u een ophaalbewerking uit te voeren. Roep de RetrieveNextMessageAsync
methode aan om het volgende bericht in de wachtrij op te halen.
Wacht tot slot op gebruikersinvoer voordat u afsluit door aan te roepen Console.ReadLine
.
Vouw de
Main
methode uit om te controleren op opdrachtregelargumenten en wacht op gebruikersinvoer. Zorg ervoor dat u in het onderstaande codefragment de{storageAccountName}
tijdelijke aanduiding vervangt door de naam van uw opslagaccount.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(); }
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;
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.";
}
}
}
}
Ontwikkel de app en voer deze uit
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
De uitvoer moet er ongeveer als volgt uitzien:
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.
- Quickstart voor wachtrijen - .NET
- Quickstart voor wachtrijen - Java
- Quickstart voor wachtrijen - Python
- Quickstart voor wachtrijen - JavaScript
Zie Codevoorbeelden met .NET-versie 11.x voor gerelateerde codevoorbeelden met .NET-versie 11.x.