Bagikan melalui


Mengirim pesan ke topik Azure Service Bus dan menerima pesan dari langganan ke topik tersebut (Java)

Di tutorial mulai cepat ini, Anda akan menulis kode Java menggunakan paket azure-messaging-servicebus untuk mengirim pesan ke topik Azure Service Bus dan menerima pesan dari langganan ke topik tersebut.

Catatan

Mulai cepat ini memberikan petunjuk langkah demi langkah untuk skenario sederhana dalam mengirim kumpulan pesan ke topik Bus Layanan dan menerima pesan tersebut dari langganan topik. Anda dapat menemukan sampel Java bawaan untuk Azure Service Bus di Repositori Azure SDK untuk Java di GitHub.

Tip

Jika Anda bekerja dengan sumber daya Azure Bus Layanan dalam aplikasi Spring, kami sarankan Anda mempertimbangkan Spring Cloud Azure sebagai alternatif. Spring Cloud Azure adalah proyek sumber terbuka yang menyediakan integrasi Spring tanpa hambatan dengan layanan Azure. Untuk mempelajari selengkapnya tentang Spring Cloud Azure, dan untuk melihat contoh menggunakan Bus Layanan, lihat Spring Cloud Stream dengan Azure Bus Layanan.

Prasyarat

Membuat namespace layanan di portal Microsoft Azure

Untuk mulai menggunakan entitas Olahpesan Azure Service Bus di Azure, Anda harus terlebih dahulu membuat namespace layanan dengan nama yang unik di Azure. Namespace menyediakan kontainer cakupan untuk sumber daya Bus Layanan (antrean, topik, dll.) dalam aplikasi Anda.

Untuk membuat namespace layanan:

  1. Masuk ke portal Azure.

  2. Navigasi ke halaman Semua layanan.

  3. Di bilah navigasi kiri, pilih Integrasi dari daftar kategori, arahkan mouse ke atas Bus Layanan, lalu pilih + tombol pada petak peta Bus Layanan.

    Gambar yang memperlihatkan pilihan Buat sumber daya, Integrasi, lalu Azure Service Bus di menu.

  4. Di tag Dasar-Dasar pada halaman Buat kumpulan nama, ikuti langkah-langkah berikut:

    1. Untuk Langganan, pilih langganan Azure untuk membuat namespace layanan.

    2. Untuk Grup sumber daya, pilih grup sumber daya yang sudah ada tempat namespace layanan akan aktif, atau buat grup baru.

    3. Masukkan nama untuk kumpulan nama. Nama namespace harus mematuhi konvensi penamaan berikut:

      • Nama yang Anda pilih harus unik di seluruh Azure. Sistem akan segera memeriksa untuk melihat apakah nama tersebut tersedia.
      • Panjang nama minimal 6 dan maksimal 50 karakter.
      • Nama hanya boleh berisi huruf, angka, tanda hubung “-“.
      • Nama harus dimulai dengan huruf dan diakhiri dengan huruf atau angka.
      • Nama tidak diakhiri dengan “-sb“ atau “-mgmt“.
    4. Untuk Lokasi, pilih wilayah tempat namespace layanan Anda akan dihosting.

    5. Untuk Tingkat harga, pilih tingkat harga (Dasar, Standar, atau Premium) untuk kumpulan namanya. Untuk mulai cepat ini, pilih Standar.

      Penting

      Jika Anda ingin menggunakan topik dan langganan, pilih Standar atau Premium. Topik/langganan tidak didukung di tingkat harga Dasar.

      Jika Anda memilih tingkat harga Premium, tentukan jumlah unit olahpesan. Tingkat premium menyediakan isolasi sumber daya di tingkat CPU dan memori sehingga setiap beban kerja berjalan dalam isolasi. Kontainer sumber daya ini disebut unit Olahpesan. Namespace layanan premium memiliki setidaknya satu unit Olahpesan. Anda dapat membeli 1, 2, 4, 8, atau 16 unit Olahpesan untuk setiap namespace layanan Service Bus Premium. Untuk mengetahui informasi selengkapnya, lihat Olahpesan Premium Azure Service Bus.

    6. Pilih Tinjau + buat di bagian bawah halaman.

      Gambar yang memperlihatkan halaman Buat kumpulan nama

    7. Pada halaman Tinjau + buat, tinjau pengaturan, dan pilih Buat.

  5. Setelah penyebaran sumber daya berhasil, pilih Buka sumber daya di halaman penyebaran.

    Gambar yang memperlihatkan halaman penyebaran yang berhasil dengan tautan Buka sumber daya.

  6. Anda melihat beranda untuk namespace layanan bus layanan Anda.

    Gambar yang memperlihatkan halaman beranda kumpulan nama Azure Service Bus yang dibuat.

Membuat topik menggunakan portal Microsoft Azure

  1. Di halaman Namespace Bus Layanan, pilih Topik di menu sebelah kiri.

  2. Pilih + Topik di toolbar.

  3. Masukkan nama untuk topik. Biarkan opsi lain dengan nilai defaultnya.

  4. Pilih Buat.

    Gambar menampilkan halaman Buat topik.

Membuat langganan untuk topik tersebut

  1. Pilih topik yang Anda buat di sesi sebelumnya.

    Gambar menampilkan pilihan topik dari daftar topik.

  2. Di halaman Topik Bus Layanan, pilih + Langganan di bar alat.

    Gambar menampilkan tombol Tambahkan langganan.

  3. Di halaman Membuat Langganan, ikuti langkah-langkah berikut:

    1. Masukkan S1 untuk nama langganan.

    2. Masukkan 3 untuk jumlah pengiriman Maks.

    3. Lalu, pilih Buat untuk membuat langganan.

      Gambar menampilkan halaman Buat langganan.

Mengautentikasi aplikasi ke Azure

Mulai cepat ini menunjukkan kepada Anda dua cara menyambungkan ke Azure Bus Layanan: tanpa kata sandi dan string koneksi.

Opsi pertama menunjukkan kepada Anda cara menggunakan prinsip keamanan Anda di ID Microsoft Entra dan kontrol akses berbasis peran (RBAC) untuk menyambungkan ke namespace Bus Layanan. Anda tidak perlu khawatir memiliki string koneksi yang dikodekan secara permanen dalam kode Anda atau dalam file konfigurasi atau dalam penyimpanan aman seperti Azure Key Vault.

Opsi kedua menunjukkan cara menggunakan string koneksi untuk menyambungkan ke namespace Bus Layanan. Jika Anda baru menggunakan Azure, Anda mungkin menemukan opsi string koneksi lebih mudah diikuti. Sebaiknya gunakan opsi tanpa kata sandi di aplikasi dunia nyata dan lingkungan produksi. Untuk informasi selengkapnya, lihat Autentikasi dan otorisasi. Anda juga dapat membaca selengkapnya tentang autentikasi tanpa kata sandi di halaman gambaran umum.

Menetapkan peran ke pengguna Microsoft Entra Anda

Saat mengembangkan secara lokal, pastikan bahwa akun pengguna yang tersambung ke Azure Bus Layanan memiliki izin yang benar. Anda memerlukan peran Pemilik Data azure Bus Layanan untuk mengirim dan menerima pesan. Untuk menetapkan sendiri peran ini, Anda memerlukan peran Administrator Akses Pengguna, atau peran lain yang menyertakan tindakan.Microsoft.Authorization/roleAssignments/write Anda dapat menetapkan peran Azure RBAC kepada pengguna menggunakan portal Azure, Azure CLI, atau Azure PowerShell. Pelajari selengkapnya tentang cakupan yang tersedia untuk penetapan peran di halaman gambaran umum cakupan .

Contoh berikut menetapkan peran ke Azure Service Bus Data Owner akun pengguna Anda, yang menyediakan akses penuh ke sumber daya Azure Bus Layanan. Dalam skenario nyata, ikuti Prinsip Hak Istimewa Paling Sedikit untuk memberi pengguna hanya izin minimum yang diperlukan untuk lingkungan produksi yang lebih aman.

Peran bawaan untuk Azure Service Bus

Untuk Azure Service Bus, pengelolaan namespace dan semua sumber daya terkait melalui portal Microsoft Azure dan AZURE Resource Management API sudah dilindungi menggunakan model Azure RBAC. Azure menyediakan peran bawaan Azure di bawah ini untuk mengotorisasi akses ke namespace Microsoft Azure Service Bus:

  • Pemilik Data Azure Bus Layanan: Memungkinkan akses data ke namespace Bus Layanan dan entitasnya (antrean, topik, langganan, dan filter). Anggota peran ini dapat mengirim dan menerima pesan dari antrean atau topik/langganan.
  • Pengirim Data Azure Bus Layanan: Gunakan peran ini untuk memberikan akses pengiriman ke namespace Bus Layanan dan entitasnya.
  • Azure Bus Layanan Data Receiver: Gunakan peran ini untuk memberikan akses terima ke namespace Bus Layanan dan entitasnya.

Jika Anda ingin membuat peran kustom, lihat Hak yang diperlukan untuk operasi Bus Layanan.

Menambahkan pengguna Microsoft Entra ke peran Pemilik Bus Layanan Azure

Tambahkan nama pengguna Microsoft Entra Anda ke peran Pemilik Data Azure Bus Layanan di tingkat namespace Bus Layanan. Ini akan memungkinkan aplikasi yang berjalan dalam konteks akun pengguna Anda untuk mengirim pesan ke antrean atau topik, dan menerima pesan dari antrean atau langganan topik.

Penting

Dalam kebanyakan kasus, akan memakan waktu satu atau dua menit agar penetapan peran disebarluaskan di Azure. Dalam kasus yang jarang terjadi, mungkin perlu waktu hingga delapan menit. Jika Anda menerima kesalahan autentikasi saat pertama kali menjalankan kode, tunggu beberapa saat dan coba lagi.

  1. Jika Anda tidak membuka halaman Bus Layanan Namespace layanan di portal Azure, temukan namespace Bus Layanan Anda menggunakan bilah pencarian utama atau navigasi kiri.

  2. Pada halaman gambaran umum, pilih Kontrol akses (IAM) dari menu sebelah kiri.

  3. Di halaman Kontrol akses (IAM), pilih tab Penetapan peran.

  4. Pilih + Tambahkan dari menu atas lalu Tambahkan penetapan peran dari menu drop-down yang dihasilkan.

    Cuplikan layar yang menampilkan cara menetapkan peran.

  5. Gunakan kotak pencarian untuk memfilter hasil ke peran yang diinginkan. Untuk contoh ini, cari Azure Service Bus Data Owner dan pilih hasil yang cocok. Kemudian pilih Berikutnya.

  6. Di bagian Tetapkan akses ke, pilih Pengguna, grup, atau perwakilan layanan, lalu pilih + Pilih anggota.

  7. Dalam dialog, cari nama pengguna Microsoft Entra Anda (biasanya alamat email user@domain Anda) lalu pilih Pilih di bagian bawah dialog.

  8. Pilih Tinjau + tetapkan untuk masuk ke halaman akhir, lalu Tinjau + tetapkan lagi untuk menyelesaikan proses.

Kirim pesan ke sebuah topik

Di bagian ini, Anda membuat proyek konsol Java, dan menambahkan kode untuk mengirim pesan ke topik yang Anda buat.

Membuat proyek konsol Java

Buat proyek Java menggunakan Eclipse atau alat lain yang Anda pilih.

Konfigurasikan aplikasi Anda untuk menggunakan Azure Service Bus

Tambahkan referensi ke pustaka Azure Core dan Azure Service Bus.

Jika Anda menggunakan Eclipse dan membuat aplikasi konsol Java, konversikan proyek Java Anda ke Maven: klik kanan proyek di jendela Package Explorer , pilih Konfigurasikan ->Konversi ke proyek Maven. Kemudian, tambahkan dependensi ke dua pustaka ini seperti yang ditunjukkan oleh contoh berikut.

pom.xml Perbarui file untuk menambahkan dependensi ke paket Azure Bus Layanan dan Azure Identity.

    <dependencies>
        <dependency>
            <groupId>com.azure</groupId>
            <artifactId>azure-messaging-servicebus</artifactId>
            <version>7.13.3</version>
        </dependency>
        <dependency>
            <groupId>com.azure</groupId>
            <artifactId>azure-identity</artifactId>
            <version>1.8.0</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

Menambahkan kode untuk mengirim pesan ke topik

  1. Tambahkan pernyataan import berikut ini ke topik file Java.

    import com.azure.messaging.servicebus.*;
    import com.azure.identity.*;
    
    import java.util.concurrent.TimeUnit;
    import java.util.Arrays;
    import java.util.List;
    
  2. Di kelas , tentukan variabel untuk menyimpan string koneksi (tidak diperlukan untuk skenario tanpa kata sandi), nama topik, dan nama langganan.

    static String topicName = "<TOPIC NAME>";
    static String subName = "<SUBSCRIPTION NAME>";
    

    Penting

    Ganti <TOPIC NAME> dengan nama topik, dan <SUBSCRIPTION NAME> dengan nama langganan topik.

  3. Tambahkan metode dengan nama sendMessage di kelas untuk mengirim satu pesan ke topik tersebut.

    Penting

    Ganti NAMESPACENAME dengan nama namespace Bus Layanan Anda.

    static void sendMessage()
    {
        // create a token using the default Azure credential
        DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
                .build();
    
        ServiceBusSenderClient senderClient = new ServiceBusClientBuilder()
                .fullyQualifiedNamespace("NAMESPACENAME.servicebus.windows.net")
                .credential(credential)
                .sender()
                .topicName(topicName)
                .buildClient();
    
        // send one message to the topic
        senderClient.sendMessage(new ServiceBusMessage("Hello, World!"));
        System.out.println("Sent a single message to the topic: " + topicName);
    }
    
    
  4. Tambahkan metode dengan nama createMessages di kelas untuk membuat daftar pesan. Biasanya, Anda mendapatkan pesan ini dari berbagai bagian berbeda di aplikasi Anda. Di sini, kami membuat daftar sampel pesan.

    static List<ServiceBusMessage> createMessages()
    {
        // create a list of messages and return it to the caller
        ServiceBusMessage[] messages = {
                new ServiceBusMessage("First message"),
                new ServiceBusMessage("Second message"),
                new ServiceBusMessage("Third message")
        };
        return Arrays.asList(messages);
    }
    
  5. Tambahkan metode dengan nama metode sendMessageBatch untuk mengirim pesan ke topik yang Anda buat. Metode ini membuat ServiceBusSenderClient sebagai topik, menggunakan metode createMessages untuk mendapatkan daftar pesan, menyiapkan satu atau beberapa batch, dan mengirimkan batch tadi ke topik tersebut.

    Penting

    Ganti NAMESPACENAME dengan nama namespace Bus Layanan Anda.

    static void sendMessageBatch()
    {
        // create a token using the default Azure credential
        DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
                .build();
    
        ServiceBusSenderClient senderClient = new ServiceBusClientBuilder()
                .fullyQualifiedNamespace("NAMESPACENAME.servicebus.windows.net")
                .credential(credential)
                .sender()
                .topicName(topicName)
                .buildClient();
    
        // Creates an ServiceBusMessageBatch where the ServiceBus.
        ServiceBusMessageBatch messageBatch = senderClient.createMessageBatch();
    
        // create a list of messages
        List<ServiceBusMessage> listOfMessages = createMessages();
    
        // We try to add as many messages as a batch can fit based on the maximum size and send to Service Bus when
        // the batch can hold no more messages. Create a new batch for next set of messages and repeat until all
        // messages are sent.
        for (ServiceBusMessage message : listOfMessages) {
            if (messageBatch.tryAddMessage(message)) {
                continue;
            }
    
            // The batch is full, so we create a new batch and send the batch.
            senderClient.sendMessages(messageBatch);
            System.out.println("Sent a batch of messages to the topic: " + topicName);
    
            // create a new batch
            messageBatch = senderClient.createMessageBatch();
    
            // Add that message that we couldn't before.
            if (!messageBatch.tryAddMessage(message)) {
                System.err.printf("Message is too large for an empty batch. Skipping. Max size: %s.", messageBatch.getMaxSizeInBytes());
            }
        }
    
        if (messageBatch.getCount() > 0) {
            senderClient.sendMessages(messageBatch);
            System.out.println("Sent a batch of messages to the topic: " + topicName);
        }
    
        //close the client
        senderClient.close();
    }
    

Menerima pesan dari langganan

Di bagian ini, Anda menambahkan kode untuk mengambil pesan dari langganan ke topik tersebut.

  1. Tambahkan metode dengan nama receiveMessages untuk menerima pesan dari langganan. Metode ini membuat ServiceBusProcessorClient untuk langganan dengan menentukan satu pengelola untuk memproses pesan dan pengelola lain untuk menangani kesalahan. Kemudian, metode tersebut mengaktifkan proses. Setelah beberapa detik, metode akan mencetak pesan yang diterima, lalu menghentikan dan menutup prosesor.

    Penting

    • Ganti NAMESPACENAME dengan nama namespace Bus Layanan Anda.
    • Ganti ServiceBusTopicTest di ServiceBusTopicTest::processMessage di dalam kode dengan nama kelas Anda.
    // handles received messages
    static void receiveMessages() throws InterruptedException
    {
        DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
                .build();
    
        // Create an instance of the processor through the ServiceBusClientBuilder
        ServiceBusProcessorClient processorClient = new ServiceBusClientBuilder()
            .fullyQualifiedNamespace("NAMESPACENAME.servicebus.windows.net")
            .credential(credential)
            .processor()
            .topicName(topicName)
            .subscriptionName(subName)
            .processMessage(context -> processMessage(context))
            .processError(context -> processError(context))
            .buildProcessorClient();
    
        System.out.println("Starting the processor");
        processorClient.start();
    
        TimeUnit.SECONDS.sleep(10);
        System.out.println("Stopping and closing the processor");
        processorClient.close();
    }
    
  2. Tambahkan metode processMessage untuk memproses pesan yang diterima dari langganan Bus Layanan.

    private static void processMessage(ServiceBusReceivedMessageContext context) {
        ServiceBusReceivedMessage message = context.getMessage();
        System.out.printf("Processing message. Session: %s, Sequence #: %s. Contents: %s%n", message.getMessageId(),
            message.getSequenceNumber(), message.getBody());
    }
    
  3. Tambahkan metode processError untuk menangani pesan kesalahan.

    private static void processError(ServiceBusErrorContext context) {
        System.out.printf("Error when receiving messages from namespace: '%s'. Entity: '%s'%n",
            context.getFullyQualifiedNamespace(), context.getEntityPath());
    
        if (!(context.getException() instanceof ServiceBusException)) {
            System.out.printf("Non-ServiceBusException occurred: %s%n", context.getException());
            return;
        }
    
        ServiceBusException exception = (ServiceBusException) context.getException();
        ServiceBusFailureReason reason = exception.getReason();
    
        if (reason == ServiceBusFailureReason.MESSAGING_ENTITY_DISABLED
            || reason == ServiceBusFailureReason.MESSAGING_ENTITY_NOT_FOUND
            || reason == ServiceBusFailureReason.UNAUTHORIZED) {
            System.out.printf("An unrecoverable error occurred. Stopping processing with reason %s: %s%n",
                reason, exception.getMessage());
        } else if (reason == ServiceBusFailureReason.MESSAGE_LOCK_LOST) {
            System.out.printf("Message lock lost for message: %s%n", context.getException());
        } else if (reason == ServiceBusFailureReason.SERVICE_BUSY) {
            try {
                // Choosing an arbitrary amount of time to wait until trying again.
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                System.err.println("Unable to sleep for period of time");
            }
        } else {
            System.out.printf("Error source %s, reason %s, message: %s%n", context.getErrorSource(),
                reason, context.getException());
        }
    }
    
  4. Perbarui metode mainuntuk menggunakan sendMessage, sendMessageBatch, dan metode receiveMessages dan untuk memunculkan InterruptedException.

    public static void main(String[] args) throws InterruptedException {
        sendMessage();
        sendMessageBatch();
        receiveMessages();
    }
    

Menjalankan aplikasi

Jalankan program tersebut untuk melihat output yang mirip dengan output berikut:

  1. Jika Anda menggunakan Eclipse, klik kanan proyek, pilih Ekspor, perluas Java, pilih File JAR yang dapat dijalankan, dan ikuti langkah-langkah untuk membuat file JAR yang dapat dijalankan.

  2. Jika Anda masuk ke komputer menggunakan akun pengguna yang berbeda dari akun pengguna yang ditambahkan ke peran Azure Bus Layanan Pemilik Data, ikuti langkah-langkah ini. Jika tidak, lewati langkah ini dan lanjutkan untuk menjalankan file Jar di langkah berikutnya.

    1. Instal Azure CLI di komputer Anda.

    2. Jalankan perintah CLI berikut untuk masuk ke Azure. Gunakan akun pengguna yang sama dengan yang Anda tambahkan ke peran Pemilik Data Azure Bus Layanan.

      az login
      
  3. Jalankan file Jar menggunakan perintah berikut.

    java -jar <JAR FILE NAME>
    
  4. Anda melihat output berikut di jendela konsol.

    Sent a single message to the topic: mytopic
    Sent a batch of messages to the topic: mytopic
    Starting the processor
    Processing message. Session: e0102f5fbaf646988a2f4b65f7d32385, Sequence #: 1. Contents: Hello, World!
    Processing message. Session: 3e991e232ca248f2bc332caa8034bed9, Sequence #: 2. Contents: First message
    Processing message. Session: 56d3a9ea7df446f8a2944ee72cca4ea0, Sequence #: 3. Contents: Second message
    Processing message. Session: 7bd3bd3e966a40ebbc9b29b082da14bb, Sequence #: 4. Contents: Third message
    

Pada halaman Gambaran umum untuk namespace Bus Layanan di portal Microsoft Azure, Anda akan menemukan jumlah pesan masuk dan pesan keluar. Tunggu satu menit atau lebih lalu refresh halaman untuk melihat nilai terbaru.

Jumlah pesan masuk dan keluar

Beralih ke tab Topik di panel tengah-bawah, dan pilih topik untuk melihat halaman Topik Bus Layanan untuk topik Anda. Di halaman ini, terdapat tiga pesan masuk dan tiga pesan keluar yang ada di grafik Pesan.

Pesan masuk dan keluar

Jika Anda mengomentari receiveMessages panggilan di dalam main metode dan menjalankan aplikasinya lagi, di halaman Topik Bus Layanan, Anda akan menemukan 8 pesan masuk (4 baru) dan empat pesan keluar.

Halaman topik yang diperbarui

Di halaman ini, jika Anda memilih langganan, Anda masuk ke halaman Langganan Bus Layanan. Anda dapat mengetahui jumlah pesan aktif, jumlah pesan surat tidak terkirim, dan jenis pesan lainnya di halaman ini. Dalam contoh ini, ada empat pesan aktif yang belum diterima penerima.

Jumlah pesan aktif

Langkah berikutnya

Lihat dokumentasi dan sampel berikut: