Dukungan Spring Cloud Azure untuk Spring Messaging Azure Service Bus

Artikel ini menjelaskan cara menggunakan Spring Cloud Azure dan Spring Messaging Azure Service Bus. Spring Framework memberikan dukungan ekstensif untuk mengintegrasikan dengan sistem olahpesan.

Spring Messaging Layanan Bus Azure

Konsep utama

Azure Service Bus adalah penyedia layanan perpesanan perusahaan yang dikelola sepenuhnya dengan antrean pesan dan topik publikasi-berlangganan. Proyek Spring Messaging for Azure Service Bus menerapkan konsep inti Spring untuk pengembangan solusi olahpesan berbasis bus layanan. Ini menyediakan templat sebagai abstraksi tingkat tinggi untuk mengirim pesan. Ini juga menyediakan dukungan untuk POJO berbasis pesan dengan anotasi @ServiceBusListener dan kontainer listener. Pustaka ini mempromosikan penggunaan injeksi dependensi dan konfigurasi deklaratif. Dalam semua kasus ini, Anda dapat melihat kesamaan dengan dukungan JMS di Spring Framework dan dukungan RabbitMQ di Spring AMQP.

Penyiapan dependensi

<dependency>
  <groupId>com.azure.spring</groupId>
  <artifactId>spring-cloud-azure-starter</artifactId>
</dependency>
<dependency>
  <groupId>com.azure.spring</groupId>
  <artifactId>spring-messaging-azure-servicebus</artifactId>
</dependency>

Konfigurasi

Pustaka menyediakan opsi konfigurasi berikut untuk ServiceBusTemplate dan @ServiceBusListener:

Harta benda Tipe Deskripsi
spring.cloud.azure.message-converter.isolated-object-mapper Boolean Apakah bean ObjectMapper terisolasi digunakan untuk pengonversi pesan Bus Layanan. Diaktifkan secara default.
spring.cloud.azure.servicebus.enabled Boolean Apakah Azure Service Bus diaktifkan.
spring.cloud.azure.servicebus.connection-string string Nilai string koneksi untuk Namespace Bus Layanan.
spring.cloud.azure.servicebus.custom-endpoint-address string Alamat titik akhir kustom yang akan digunakan saat menyambungkan ke Azure Bus Layanan.
spring.cloud.azure.servicebus.namespace string Nilai Bus Layanan Namespace, yaitu awalan dari FQDN. FQDN harus terdiri dari NamespaceName.DomainName
spring.cloud.azure.servicebus.entity-type string Jenis entitas Azure Service Bus.

Penggunaan dasar

Pengonversi pesan Bus Layanan kustom

Ada dua cara untuk mengonfigurasi pengonversi pesan Bus Layanan:

  • Konfigurasikan properti berikut agar konverter pesan default Bus Layanan menggunakan bean ObjectMapper, yang dapat berupa bean ObjectMapper kustom Anda atau bean yang dikelola oleh Spring Boot:

    spring:
      cloud:
        azure:
          message-converter:
            isolated-object-mapper: false
    
  • Definisikan bean konverter pesan Bus Layanan secara langsung:

    @Bean
    AzureMessageConverter<ServiceBusReceivedMessage, ServiceBusMessage> serviceBusMessageConverter() {
        JsonMapper jsonMapper = JsonMapper.builder().addModule(new JavaTimeModule()).build();
        return new ServiceBusMessageConverter(jsonMapper);
    }
    

Mengirim pesan ke Azure Service Bus

Gunakan langkah-langkah berikut untuk mengirim pesan:

  1. Isi opsi konfigurasi kredensial menggunakan salah satu pendekatan berikut:

    • Untuk kredensial sebagai DefaultAzureCredential, konfigurasikan properti berikut dalam file application.yml Anda:

      spring:
        cloud:
          azure:
            servicebus:
              namespace: ${AZURE_SERVICE_BUS_NAMESPACE}
              entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
      
    • Untuk kredensial sebagai string koneksi, konfigurasikan properti berikut dalam file application.yml Anda:

      spring:
        cloud:
          azure:
            servicebus:
              connection-string: ${AZURE_SERVICE_BUS_CONNECTION_STRING}
              entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
      
    • Untuk kredensial sebagai identitas terkelola, konfigurasikan properti berikut dalam file application.yml Anda:

      spring:
        cloud:
          azure:
            credential:
              managed-identity-enabled: true
              client-id: ${AZURE_CLIENT_ID}
            profile:
              tenant-id: <tenant>
            servicebus:
              namespace: ${AZURE_SERVICE_BUS_NAMESPACE}
              entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
      

Nota

Nilai berikut diizinkan untuk tenant-id: common, organizations, consumers, atau ID penyewa. Untuk informasi selengkapnya tentang nilai ini, lihat bagian Menggunakan endpoint yang salah (akun pribadi dan organisasi) dalam Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang pengonversian aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa pada Microsoft Entra ID.

  • Untuk kredensial sebagai perwakilan layanan, konfigurasikan properti berikut dalam file application.yml Anda:

    spring:
      cloud:
        azure:
          credential:
            client-id: ${AZURE_CLIENT_ID}
            client-secret: ${AZURE_CLIENT_SECRET}
          profile:
            tenant-id: <tenant>
          servicebus:
            namespace: ${AZURE_SERVICE_BUS_NAMESPACE}
            entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
    

Nota

Nilai berikut diizinkan untuk tenant-id: common, organizations, consumers, atau ID penyewa. Untuk informasi selengkapnya tentang nilai ini, lihat bagian Menggunakan endpoint yang salah (akun pribadi dan organisasi) dalam Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang pengonversian aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa pada Microsoft Entra ID.

  1. ServiceBusTemplate dikonfigurasi otomatis, dan Anda dapat mengotomatiskannya langsung ke kacang Anda sendiri, seperti yang ditunjukkan dalam contoh berikut:

    @Component
    public class MyBean {
    
        private final ServiceBusTemplate serviceBusTemplate;
    
        public MyBean(ServiceBusTemplate serviceBusTemplate) {
            this.serviceBusTemplate = serviceBusTemplate;
        }
    
        public void someMethod() {
            this.serviceBusTemplate.sendAsync('QUEUE_NAME', MessageBuilder.withPayload("Hello world").build()).subscribe();
        }
    
    }
    

Menerima pesan dari Azure Service Bus

Gunakan langkah-langkah berikut untuk menerima pesan:

  1. Isi opsi konfigurasi kredensial.

  2. Tambahkan anotasi @EnableAzureMessaging, yang memicu penemuan metode yang dianotasi dengan @ServiceBusListener, membuat kontainer pendengar pesan di bawah sampul.

    @SpringBootApplication
    @EnableAzureMessaging
    public class DemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    }
    

    Nota

    Untuk menghindari pengulangan, sejak versi 5.21.0, Spring Cloud Azure Auto-configure secara otomatis mengaktifkan anotasi @EnableAzureMessaging.

  3. Saat infrastruktur ServiceBus tersedia, Anda dapat menganotasi bean apa pun dengan @ServiceBusListener untuk membuat endpoint pendengar. Komponen berikut membuat endpoint listener pada antrean QUEUE_NAME:

    @Component
    public class MyBean {
    
        @ServiceBusListener(destination = "QUEUE_NAME")
        public void processMessage(String content) {
            // ...
        }
    
    }
    

Menyesuaikan properti klien Azure Bus Layanan

Pengembang dapat menggunakan AzureServiceClientBuilderCustomizer untuk menyesuaikan properti Klien Bus Layanan. Contoh berikut mengkustomisasi properti sessionIdleTimeout di ServiceBusClientBuilder:

@Bean
public AzureServiceClientBuilderCustomizer<ServiceBusClientBuilder.ServiceBusSessionProcessorClientBuilder> customizeBuilder() {
    return builder -> builder.sessionIdleTimeout(Duration.ofSeconds(10));
}

Contoh-contoh

Untuk informasi selengkapnya, lihat azure-spring-boot-samples repositori di GitHub.