Samouczek: praca z kolejkami usługi Azure Queue Storage na platformie .NET
Usługa Azure Queue Storage implementuje kolejki oparte na chmurze, aby umożliwić komunikację między składnikami aplikacji rozproszonej. Każda kolejka przechowuje listę komunikatów, które mogą być dodawane przez składnik nadawcy i przetwarzane przez składnik odbiorcy. Dzięki kolejce aplikacja może natychmiast skalować w celu spełnienia wymagań. W tym artykule przedstawiono podstawowe kroki pracy z kolejką usługi Azure Queue Storage.
Ten samouczek zawiera informacje na temat wykonywania następujących czynności:
- Tworzenie konta usługi Azure Storage
- Tworzenie aplikacji
- Dodawanie bibliotek klienckich platformy Azure
- Dodawanie obsługi kodu asynchronicznego
- Tworzenie kolejki
- Wstawianie komunikatów do kolejki
- Dequeue messages (Dequeue messages)
- Usuwanie pustej kolejki
- Sprawdzanie argumentów wiersza polecenia
- Skompiluj i uruchom aplikację
Wymagania wstępne
- Pobierz bezpłatną kopię międzyplatformowego edytora Visual Studio Code.
- Pobierz i zainstaluj zestaw .NET Core SDK w wersji 3.1 lub nowszej.
- Jeśli nie masz bieżącej subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto .
Tworzenie konta usługi Azure Storage
Najpierw utwórz konto usługi Azure Storage. Aby zapoznać się z przewodnikiem krok po kroku dotyczącym tworzenia konta magazynu, zobacz Tworzenie konta magazynu. Jest to oddzielny krok, który należy wykonać po utworzeniu bezpłatnego konta platformy Azure w wymaganiach wstępnych.
Tworzenie aplikacji
Utwórz aplikację platformy .NET Core o nazwie QueueApp
. Dla uproszczenia ta aplikacja będzie wysyłać i odbierać komunikaty za pośrednictwem kolejki.
W oknie konsoli (takim jak cmd, PowerShell lub interfejs wiersza polecenia platformy Azure) użyj
dotnet new
polecenia , aby utworzyć nową aplikację konsolową o nazwieQueueApp
. To polecenie tworzy prosty projekt języka C# "hello world" z pojedynczym plikiem źródłowym o nazwieProgram.cs
.dotnet new console -n QueueApp
Przejdź do nowo utworzonego folderu
QueueApp
i skompiluj aplikację, aby sprawdzić, czy wszystko jest w porządku.cd QueueApp
dotnet build
Powinny zostać wyświetlone wyniki podobne do następujących danych wyjściowych:
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>_
Dodawanie bibliotek klienckich platformy Azure
Dodaj biblioteki klienta usługi Azure Storage do projektu przy użyciu
dotnet add package
polecenia .Uruchom następujące polecenie z folderu projektu w oknie konsoli.
dotnet add package Azure.Storage.Queues
Dodawanie instrukcji using
W wierszu polecenia w katalogu projektu wpisz
code .
, aby otworzyć Visual Studio Code w bieżącym katalogu. Pozostaw otwarte okno wiersza polecenia. Będzie więcej poleceń do uruchomienia później. Jeśli zostanie wyświetlony monit o dodanie zasobów języka C# wymaganych do skompilowania i debugowania, kliknij przycisk Tak .Program.cs
Otwórz plik źródłowy i dodaj następujące przestrzenie nazw bezpośrednio po instrukcjiusing System;
. Ta aplikacja używa typów z tych przestrzeni nazw do łączenia się z usługą Azure Storage i pracy z kolejkami.using System.Threading.Tasks; using Azure.Storage.Queues; using Azure.Storage.Queues.Models;
Zapisz plik
Program.cs
.
Dodawanie obsługi kodu asynchronicznego
Ponieważ aplikacja korzysta z zasobów w chmurze, kod jest uruchamiany asynchronicznie.
Zaktualizuj metodę
Main
, aby uruchomić asynchronicznie. Zastąpvoid
element wartością zwracanąasync Task
.static async Task Main(string[] args)
Zapisz plik
Program.cs
.
Tworzenie kolejki
Przed wykonaniem wywołań do interfejsów API platformy Azure należy uzyskać poświadczenia z Azure Portal.
Kopiowanie poświadczeń z witryny Azure Portal
Gdy przykładowa aplikacja wysyła żądanie do usługi Azure Storage, musi być autoryzowana. Aby autoryzować żądanie, dodaj poświadczenia konta magazynu do aplikacji jako parametry połączenia. Aby wyświetlić poświadczenia konta magazynu, wykonaj następujące kroki:
Zaloguj się w witrynie Azure Portal.
Odszukaj konto magazynu.
W okienku menu konta magazynu w obszarze Zabezpieczenia i sieć wybierz pozycję Klucze dostępu. W tym miejscu można wyświetlić klucze dostępu do konta i pełne parametry połączenia dla każdego klucza.
W okienku Klucze dostępu wybierz pozycję Pokaż klucze.
W sekcji key1 znajdź wartość Parametry połączenia . Wybierz ikonę Kopiuj do schowka , aby skopiować parametry połączenia. W następnej sekcji dodasz wartość parametrów połączenia do zmiennej środowiskowej.
Konfigurowanie parametrów połączenia magazynu
Po skopiowaniu parametrów połączenia zapisz je w nowej zmiennej środowiskowej na komputerze lokalnym z uruchomioną aplikacją. Aby ustawić zmienną środowiskową, otwórz okno konsoli i postępuj zgodnie z instrukcjami dla systemu operacyjnego. Zastąp <yourconnectionstring>
ciąg rzeczywistymi parametrami połączenia.
setx AZURE_STORAGE_CONNECTION_STRING "<yourconnectionstring>"
Po dodaniu zmiennej środowiskowej w systemie Windows należy uruchomić nowe wystąpienie okna polecenia.
Ponowne uruchamianie programów
Po dodaniu zmiennej środowiskowej uruchom ponownie wszystkie uruchomione programy, które będą musiały odczytać zmienną środowiskową. Na przykład przed kontynuowaniem uruchom ponownie środowisko programistyczne lub edytor.
Dodawanie parametrów połączenia do aplikacji
Dodaj parametry połączenia do aplikacji, aby uzyskać dostęp do konta magazynu.
Wróć do Visual Studio Code.
W metodzie
Main
zastąpConsole.WriteLine("Hello, World");
kod następującym wierszem, który pobiera parametry połączenia ze zmiennej środowiskowej.string connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING");
Dodaj następujący kod, aby
Main
utworzyć obiekt kolejki, który jest później przekazywany do metod wysyłania i odbierania.QueueClient queue = new QueueClient(connectionString, "mystoragequeue");
Zapisz plik.
Wstawianie komunikatów do kolejki
Utwórz nową metodę wysyłania komunikatu do kolejki.
Dodaj następującą
InsertMessageAsync
metodę doProgram
klasy .Ta metoda jest przekazywana odwołanie do kolejki. Zostanie utworzona nowa kolejka, jeśli jeszcze nie istnieje, wywołując metodę
CreateIfNotExistsAsync
. Następnie dodaje elementnewMessage
do kolejki, wywołując metodęSendMessageAsync
.static async Task InsertMessageAsync(QueueClient theQueue, string newMessage) { if (null != await theQueue.CreateIfNotExistsAsync()) { Console.WriteLine("The queue was created."); } await theQueue.SendMessageAsync(newMessage); }
Opcjonalne: Domyślnie maksymalny czas wygaśnięcia wiadomości wynosi siedem dni. Możesz określić dowolną liczbę dodatnią dla czasu wygaśnięcia wiadomości. Poniższy fragment kodu dodaje komunikat, który nigdy nie wygasa.
Aby dodać komunikat, który nie wygaśnie, użyj
Timespan.FromSeconds(-1)
w wywołaniu metody .SendMessageAsync
await theQueue.SendMessageAsync(newMessage, default, TimeSpan.FromSeconds(-1), default);
Zapisz plik.
Komunikat w kolejce musi być w formacie zgodnym z żądaniem XML przy użyciu kodowania UTF-8. Rozmiar komunikatu może wynosić do 64 KB. Jeśli komunikat zawiera dane binarne, zakoduj komunikat Base64 .
Dequeue messages (Dequeue messages)
Utwórz nową metodę pobierania komunikatu z kolejki. Po pomyślnym odebraniu komunikatu ważne jest usunięcie go z kolejki, aby nie było przetwarzane więcej niż raz.
Dodaj nową metodę o nazwie
RetrieveNextMessageAsync
doProgram
klasy.Ta metoda odbiera komunikat z kolejki, wywołując
ReceiveMessagesAsync
metodę , przekazując1
pierwszy parametr w celu pobrania tylko kolejnego komunikatu w kolejce. Po odebraniu komunikatu usuń go z kolejki, wywołując metodęDeleteMessageAsync
.Gdy komunikat jest wysyłany do kolejki z wersją zestawu SDK przed wersją 12, jest on automatycznie zakodowany w formacie Base64. Począwszy od wersji 12, ta funkcja została usunięta. Podczas pobierania komunikatu przy użyciu zestawu SDK w wersji 12 nie jest on automatycznie dekodowany za pomocą algorytmu Base64. Musisz jawnie zdekodować zawartość w formacie Base64 samodzielnie.
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; }
Zapisz plik.
Usuwanie pustej kolejki
Jest to najlepsze rozwiązanie na końcu projektu, aby określić, czy nadal są potrzebne utworzone zasoby. Uruchomione zasoby mogą generować koszty. Jeśli kolejka istnieje, ale jest pusta, zapytaj użytkownika, czy chce ją usunąć.
Rozwiń metodę ,
RetrieveNextMessageAsync
aby dołączyć monit o usunięcie pustej kolejki.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."; } }
Zapisz plik.
Sprawdzanie argumentów wiersza polecenia
Jeśli do aplikacji są przekazywane argumenty wiersza polecenia, załóżmy, że są one komunikatem, który ma zostać dodany do kolejki. Połącz argumenty, aby utworzyć ciąg. Dodaj ten ciąg do kolejki komunikatów, wywołując wcześniej dodaną metodę InsertMessageAsync
.
Jeśli nie ma argumentów wiersza polecenia, spróbuj pobrać operację. Wywołaj metodę , RetrieveNextMessageAsync
aby pobrać następny komunikat w kolejce.
Na koniec poczekaj na dane wejściowe użytkownika przed zakończeniem pracy, wywołując metodę Console.ReadLine
.
Rozwiń metodę ,
Main
aby sprawdzić argumenty wiersza polecenia i poczekać na wprowadzenie danych przez użytkownika.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(); }
Zapisz plik.
Kompletny kod
Oto kompletna lista kodu dla tego projektu.
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.";
}
}
}
}
Skompiluj i uruchom aplikację
W wierszu polecenia w katalogu projektu uruchom następujące polecenie dotnet, aby skompilować projekt.
dotnet build
Po pomyślnym utworzeniu projektu uruchom następujące polecenie, aby dodać pierwszy komunikat do kolejki.
dotnet run First queue message
Powinny być widoczne następujące dane wyjściowe:
C:\Tutorials\QueueApp>dotnet run First queue message The queue was created. Sent: First queue message Press Enter..._
Uruchom aplikację bez argumentów wiersza polecenia, aby odbierać i usuwać pierwszy komunikat w kolejce.
dotnet run
Kontynuuj uruchamianie aplikacji do momentu usunięcia wszystkich komunikatów. Jeśli uruchomisz go jeszcze raz, zostanie wyświetlony komunikat informujący, że kolejka jest pusta i zostanie wyświetlony monit o usunięcie kolejki.
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>_
Następne kroki
W niniejszym samouczku zawarto informacje na temat wykonywania następujących czynności:
- Tworzenie kolejki
- Dodawanie i usuwanie komunikatów z kolejki
- Usuwanie kolejki usługi Azure Queue Storage
Aby uzyskać więcej informacji, zapoznaj się z przewodnikami Szybki start usługi Azure Queue Storage.
- Przewodnik Szybki start dotyczący kolejek dla platformy .NET
- Przewodnik Szybki start dotyczący kolejek dla języka Java
- Przewodnik Szybki start dotyczący kolejek dla języka Python
- Przewodnik Szybki start dotyczący kolejek dla języka JavaScript
Aby uzyskać powiązane przykłady kodu korzystające z przestarzałych zestawów SDK platformy .NET w wersji 11.x, zobacz Przykłady kodu przy użyciu platformy .NET w wersji 11.x.