Tworzenie usługi Azure Queue Storage i komunikatów oraz zarządzanie nimi przy użyciu platformy .NET

Ukończone

W tej lekcji omówimy sposób tworzenia kolejek i zarządzania komunikatami w usłudze Azure Queue Storage, pokazując fragmenty kodu z projektu platformy .NET.

Przykłady kodu bazują na następujących pakietach NuGet:

Tworzenie klienta usługi kolejkowania

Klasa QueueClient umożliwia pobieranie kolejek przechowywanych w usłudze Queue Storage. Oto jeden ze sposobów tworzenia klienta usługi:

QueueClient queueClient = new QueueClient(connectionString, queueName);

Utwórz kolejkę

W tym przykładzie pokazano, jak utworzyć kolejkę, jeśli jeszcze nie istnieje:

// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];

// Instantiate a QueueClient which will be used to create and manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);

// Create the queue
queueClient.CreateIfNotExists();

Wstaw komunikat do kolejki

Aby wstawić komunikat do istniejącej kolejki, wywołaj metodę SendMessage. Komunikat może być ciągiem (w formacie UTF-8) lub tablicą bajtów. Poniższy kod tworzy kolejkę (jeśli nie istnieje) i wstawia komunikat:

// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];

// Instantiate a QueueClient which will be used to create and manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);

// Create the queue if it doesn't already exist
queueClient.CreateIfNotExists();

if (queueClient.Exists())
{
    // Send a message to the queue
    queueClient.SendMessage(message);
}

Przyjrzyj się następnej wiadomości

Komunikaty w kolejce można podejrzeć, nie usuwając ich z kolejki, wywołując metodę PeekMessages. Jeśli nie przekażesz wartości parametru maxMessages, wartością domyślną jest sprawdzanie jednego komunikatu.

// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];

// Instantiate a QueueClient which will be used to manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);

if (queueClient.Exists())
{ 
    // Peek at the next message
    PeekedMessage[] peekedMessage = queueClient.PeekMessages();
}

Zmiana zawartości komunikatu w kolejce

Zawartość komunikatu można zmienić w kolejce. Jeśli komunikat reprezentuje zadanie robocze, możesz użyć tej funkcji, aby zaktualizować stan zadania roboczego. Poniższy kod aktualizuje komunikat kolejki o nową zawartość i ustawia limit czasu widoczności, aby przedłużyć kolejne 60 sekund. Spowoduje to zapisanie stanu pracy skojarzonej z komunikatem i daje klientowi kolejną minutę na kontynuowanie pracy nad komunikatem.

// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];

// Instantiate a QueueClient which will be used to manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);

if (queueClient.Exists())
{
    // Get the message from the queue
    QueueMessage[] message = queueClient.ReceiveMessages();

    // Update the message contents
    queueClient.UpdateMessage(message[0].MessageId, 
            message[0].PopReceipt, 
            "Updated contents",
            TimeSpan.FromSeconds(60.0)  // Make it invisible for another 60 seconds
        );
}

Usuń z kolejki następną wiadomość

Usuń wiadomość z kolejki w dwóch krokach. Po wywołaniu ReceiveMessages, zostanie wyświetlony następny komunikat w kolejce. Komunikat zwrócony z ReceiveMessages staje się niewidoczny dla jakiegokolwiek innego kodu odczytującego wiadomości z tej kolejki. Domyślnie komunikat pozostanie niewidoczny przez 30 sekund. Aby zakończyć usuwanie komunikatu z kolejki, należy również wywołać metodę DeleteMessage. Ten dwuetapowy proces usuwania komunikatów gwarantuje, że jeśli kod nie będzie w stanie przetworzyć komunikatu z powodu awarii sprzętu lub oprogramowania, inne wystąpienie kodu będzie w stanie uzyskać ten sam komunikat i ponowić próbę. Twój kod wywołuje DeleteMessage, bezpośrednio po przetworzeniu wiadomości.

// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];

// Instantiate a QueueClient which will be used to manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);

if (queueClient.Exists())
{
    // Get the next message
    QueueMessage[] retrievedMessage = queueClient.ReceiveMessages();

    // Process (i.e. print) the message in less than 30 seconds
    Console.WriteLine($"Dequeued message: '{retrievedMessage[0].Body}'");

    // Delete the message
    queueClient.DeleteMessage(retrievedMessage[0].MessageId, retrievedMessage[0].PopReceipt);
}

Uzyskaj długość kolejki

Możesz oszacować ilość wiadomości w kolejce. Metoda GetProperties zwraca właściwości kolejki, w tym liczbę komunikatów. Właściwość ApproximateMessagesCount zawiera przybliżoną liczbę komunikatów w kolejce. Podana liczba nie jest mniejsza niż rzeczywista liczba komunikatów w kolejce, ale może być większa.

/// Instantiate a QueueClient which will be used to manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);

if (queueClient.Exists())
{
    QueueProperties properties = queueClient.GetProperties();

    // Retrieve the cached approximate message count.
    int cachedMessagesCount = properties.ApproximateMessagesCount;

    // Display number of messages.
    Console.WriteLine($"Number of messages in queue: {cachedMessagesCount}");
}

Usuń kolejkę

Aby usunąć kolejkę i wszystkie zawarte w niej komunikaty, wywołaj metodę Delete w obiekcie kolejki.

/// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];

// Instantiate a QueueClient which will be used to manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);

if (queueClient.Exists())
{
    // Delete the queue
    queueClient.Delete();
}