Tutorial: Bekerja dengan antrean Azure Queue Storage di .NET

Azure Queue Storage mengimplementasikan antrean berbasis cloud untuk memungkinkan komunikasi antar komponen aplikasi terdistribusi. Setiap antrean menyimpan daftar pesan yang dapat ditambahkan oleh komponen pengirim dan diproses oleh komponen penerima. Dengan antrean, aplikasi Anda dapat segera diskalakan untuk memenuhi permintaan. Artikel ini memperlihatkan langkah-langkah dasar untuk bekerja dengan antrean Azure Queue Storage.

Dalam tutorial ini, Anda akan mempelajari cara:

  • Buat akun Azure Storage
  • Membuat aplikasi
  • Menambahkan pustaka klien Azure
  • Menambahkan dukungan untuk kode asinkron
  • Membuat antrean
  • Menyisipkan pesan ke dalam antrean
  • Menghapus pesan
  • Menghapus antrean kosong
  • Memeriksa argumen baris perintah
  • Buat dan jalankan aplikasi

Prasyarat

Buat akun Azure Storage

  1. Pertama, buat akun Azure Storage.

    Untuk panduan langkah demi langkah untuk membuat akun penyimpanan, lihat Membuat akun penyimpanan. Ini adalah langkah terpisah yang Anda lakukan setelah membuat akun Azure gratis dalam prasyarat.

  2. Pastikan akun pengguna Anda telah diberi peran Kontributor Data Antrean Penyimpanan, yang dilingkupkan ke akun penyimpanan, grup sumber daya induk, atau langganan. Lihat Mengautentikasi ke Azure.

Membuat aplikasi

Buat aplikasi .NET Core bernama QueueApp. Sederhananya, aplikasi ini akan mengirim dan menerima pesan melalui antrean.

  1. Di jendela konsol (seperti cmd, PowerShell, atau Azure CLI), gunakan perintah dotnet new untuk membuat aplikasi konsol baru bernama QueueApp. Perintah ini membuat proyek C# "hello world" sederhana dengan satu file sumber bernama Program.cs.

    dotnet new console -n QueueApp
    
  2. Beralih ke folder QueueApp yang baru dibuat dan buat aplikasi untuk memeriksa bahwa semuanya berjalan dengan baik.

    cd QueueApp
    
    dotnet build
    

    Anda akan melihat hasil yang mirip dengan output berikut:

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

Menambahkan pustaka klien Azure

  1. Tambahkan pustaka klien Azure Storage ke proyek dengan menggunakan perintah dotnet add package.

    Jalankan perintah berikut dari folder proyek di jendela konsol.

    dotnet add package Azure.Storage.Queues
    

Menambahkan menggunakan pernyataan

  1. Dari baris perintah di direktori proyek, ketik code . untuk membuka Visual Studio Code di direktori saat ini. Tetap buka jendela baris perintah. Akan ada lebih banyak perintah untuk dijalankan nanti. Jika Anda diminta untuk menambahkan aset C# yang diperlukan untuk membuat dan men-debug, klik tombol Ya.

  2. Buka file sumber Program.cs dan tambahkan namespace berikut tepat setelah pernyataan using System;. Aplikasi ini menggunakan jenis dari namespace tersebut untuk terhubung ke Azure Storage dan bekerja dengan antrean.

    using System.Threading.Tasks;
    using Azure.Storage.Queues;
    using Azure.Storage.Queues.Models;
    
  3. Simpan file Program.cs.

Menambahkan dukungan untuk kode asinkron

Karena aplikasi menggunakan sumber daya cloud, kode berjalan secara asinkron.

  1. Perbarui metode Main untuk menjalankan secara asinkron. Ganti void dengan async Task nilai yang dikembalikan.

    static async Task Main(string[] args)
    
  2. Simpan file Program.cs.

Membuat antrean

Sebelum melakukan panggilan apa pun ke Api Azure, Anda harus memastikan bahwa Anda diautentikasi dengan akun Microsoft Entra yang sama dengan yang Anda tetapkan perannya. Setelah diautentikasi, Anda dapat membuat dan mengotorisasi QueueClient objek dengan menggunakan DefaultAzureCredential untuk mengakses data antrean di akun penyimpanan. DefaultAzureCredential secara otomatis menemukan dan menggunakan akun yang Anda masuki. Untuk mempelajari cara masuk lalu membuat QueueClient objek, lihat Mengotorisasi akses dan membuat objek klien.

Menyisipkan pesan ke dalam antrean

Buat metode baru untuk mengirim pesan ke dalam antrean.

  1. Tambahkan metode InsertMessageAsync berikut ke kelas Program.

    Metode ini melewati referensi antrean. Antrean baru dibuat dengan memanggil CreateIfNotExistsAsync, jika belum ada. Kemudian, perintah tersebut menambah newMessage ke antrean dengan memanggil SendMessageAsync.

    static async Task InsertMessageAsync(QueueClient theQueue, string newMessage)
    {
        if (null != await theQueue.CreateIfNotExistsAsync())
        {
            Console.WriteLine("The queue was created.");
        }
    
        await theQueue.SendMessageAsync(newMessage);
    }
    
  2. Opsional: Secara default, maksimum waktu hidup pesan diatur ke tujuh hari. Anda dapat menentukan angka positif apa pun untuk waktu hidup pesan. Cuplikan kode berikut menambahkan pesan yang tidak pernah kedaluwarsa.

    Untuk menambahkan pesan yang tidak kedaluwarsa, gunakan Timespan.FromSeconds(-1) dalam panggilan Anda ke SendMessageAsync.

    await theQueue.SendMessageAsync(newMessage, default, TimeSpan.FromSeconds(-1), default);
    
  3. Simpan file.

Pesan antrean harus dalam format yang kompatibel dengan permintaan XML menggunakan pengodean UTF-8. Pesan dapat berukuran hingga 64 KB. Jika pesan berisi data biner, Base64-encode pesan tersebut.

Menghapus pesan

Buat metode baru untuk mengambil pesan dari antrean. Setelah pesan berhasil diterima, penting untuk menghapusnya dari antrean sehingga tidak diproses lebih dari sekali.

  1. Tambahkan metode baru yang dipanggil RetrieveNextMessageAsync ke kelas Program Anda.

    Metode ini menerima pesan dari antrean dengan memanggil ReceiveMessagesAsync, meneruskan 1 di parameter pertama untuk hanya mengambil pesan berikutnya dalam antrean. Setelah pesan diterima, hapus dari antrean dengan memanggil DeleteMessageAsync.

    Ketika pesan dikirim ke antrean dengan versi SDK sebelum v12, pesan secara otomatis dikodekan Base64. Dimulai dengan v12, fungsionalitas tersebut dihapus. Saat Anda mengambil pesan dengan menggunakan v12 SDK, pesan tidak secara otomatis didekodekan Base64. Anda harus secara eksplisit mendekode-Base64 konten sendiri.

    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. Simpan file.

Menghapus antrean kosong

Ini adalah praktik terbaik di akhir proyek untuk mengidentifikasi apakah Anda masih membutuhkan sumber daya yang Anda buat. Sumber daya yang dibiarkan berjalan dapat menghabiskan uang Anda. Jika antrean ada tetapi kosong, tanyakan kepada pengguna apakah mereka ingin menghapusnya.

  1. Perluas metode RetrieveNextMessageAsync untuk menyertakan perintah untuk menghapus antrean kosong.

    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. Simpan file.

Memeriksa argumen baris perintah

Jika ada argumen baris perintah yang diteruskan ke aplikasi, asumsikan argumen tersebut adalah pesan yang akan ditambahkan ke antrean. Gabungkan argumen untuk membuat string. Tambahkan string ini ke antrean pesan dengan memanggil metode InsertMessageAsync yang kami tambahkan sebelumnya.

Jika tidak ada argumen baris perintah, coba operasi ambil. Panggil metode RetrieveNextMessageAsync untuk mengambil pesan berikutnya dalam antrean.

Terakhir, tunggu input pengguna sebelum keluar dengan memanggil Console.ReadLine.

  1. Perluas metode Main untuk memeriksa argumen baris perintah dan menunggu input pengguna. Dalam cuplikan kode di bawah ini, pastikan untuk mengganti {storageAccountName} tempat penampung dengan nama akun penyimpanan Anda.

    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();
    }
    
  2. Simpan file.

Kode lengkap

Berikut adalah daftar kode lengkap untuk proyek ini.

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

Buat dan jalankan aplikasi

  1. Dari baris perintah di direktori proyek, jalankan perintah dotnet berikut untuk membangun proyek.

    dotnet build
    
  2. Setelah proyek berhasil dibangun, jalankan perintah berikut untuk menambahkan pesan pertama ke antrean.

    dotnet run First queue message
    

    Anda akan melihat output berikut:

    C:\Tutorials\QueueApp>dotnet run First queue message
    The queue was created.
    Sent: First queue message
    Press Enter..._
    
  3. Jalankan aplikasi tanpa argumen baris perintah untuk menerima dan menghapus pesan pertama dalam antrean.

    dotnet run
    
  4. Lanjutkan menjalankan aplikasi hingga semua pesan dihapus. Jika Anda menjalankannya sekali lagi, Anda akan mendapatkan pesan bahwa antrean kosong dan perintah untuk menghapus antrean.

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

Langkah berikutnya

Dalam tutorial ini, Anda mempelajari cara:

  1. Membuat antrean
  2. Menambahkan dan menghapus pesan dari antrean
  3. Menghapus antrean Azure Queue Storage

Lihat mulai cepat Azure Queue Storage untuk informasi selengkapnya.

Untuk sampel kode terkait menggunakan .NET versi 11.x SDK yang tidak digunakan lagi, lihat Sampel kode menggunakan .NET versi 11.x.