Spring Messaging Azure Service Bus için Spring Cloud Azure desteği

Bu makalede Spring Cloud Azure ve Spring Messaging Azure Service Bus'ı nasıl kullanabileceğiniz açıklanmaktadır. Spring Framework, mesajlaşma sistemleriyle tümleştirme için kapsamlı destek sağlar.

Spring Mesajlaşma Azure Hizmet Veri Yolu

Temel kavramlar

Azure Service Bus, ileti kuyrukları ve yayımlama-abone olma konularına sahip tam olarak yönetilen bir kurumsal ileti aracısıdır. Azure Service Bus için Spring Messaging projesi, hizmet veri yolu tabanlı mesajlaşma çözümlerinin geliştirilmesine temel Spring kavramlarını uygular. İleti göndermek için üst düzey soyutlama olarak bir şablonu sağlar. Ayrıca, @ServiceBusListener notları ve bir dinleyici kapsayıcısı ile mesaj odaklı POJO'lar için de destek sağlar. Bu kitaplıklar bağımlılık ekleme ve bildirim temelli yapılandırma kullanımını teşvik eder. Tüm bu durumlarda Spring Framework'te JMS desteğiyle ve Spring AMQP'de RabbitMQ desteğiyle benzerlikler görebilirsiniz.

Bağımlılık kurulumu

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

Konfigürasyon

Kitaplık, ServiceBusTemplate ve @ServiceBusListeneriçin aşağıdaki yapılandırma seçeneklerini sağlar:

Mülkiyet Türü Açıklama
spring.cloud.azure.message-converter.isolated-object-mapper Boolean Service Bus ileti dönüştürücüsü için yalıtılmış bir ObjectMapper çekirdeğinin kullanılıp kullanılmadığı. Varsayılan olarak etkindir.
spring.cloud.azure.servicebus.enabled Boolean Azure Service Bus'ın etkinleştirilip etkinleştirilmediği.
spring.cloud.azure.servicebus.connection-string Dize Service Bus ad alanı bağlantı dizesi değeri.
spring.cloud.azure.servicebus.custom-endpoint-address Dize Service Bus'a bağlanırken kullanılacak özel uç nokta adresi.
spring.cloud.azure.servicebus.namespace Dize FQDN’nin ön ekini oluşturan Service Bus ad alanı değeri. FQDN, NamespaceName.DomainName dosyasından oluşmalıdır
spring.cloud.azure.servicebus.entity-type Dize Azure Service Bus varlık türü.

Temel kullanım

Özel Service Bus ileti dönüştürücüsü

Service Bus ileti dönüştürücüsİnİ yapılandırmanın iki yolu vardır:

  • Aşağıdaki özelliği, varsayılan Service Bus ileti dönüştürücüsünü özel ObjectMapper fasulyeniz veya Spring Boot tarafından yönetilen bir ObjectMapper fasulye kullanacak şekilde yapılandırın:

    spring:
      cloud:
        azure:
          message-converter:
            isolated-object-mapper: false
    
  • Service Bus ileti dönüştürücüsü çekirdeğini doğrudan tanımlayın:

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

Azure Service Bus'a ileti gönderme

İleti göndermek için aşağıdaki adımları kullanın:

  1. Aşağıdaki yaklaşımlardan birini kullanarak kimlik bilgisi yapılandırma seçeneklerini doldurun:

    • DefaultAzureCredentialkimlik bilgileri için application.yml dosyanızda aşağıdaki özellikleri yapılandırın:

      spring:
        cloud:
          azure:
            servicebus:
              namespace: ${AZURE_SERVICE_BUS_NAMESPACE}
              entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
      
    • Bağlantı dizesi olarak kimlik bilgileri için application.yml dosyanızda aşağıdaki özellikleri yapılandırın:

      spring:
        cloud:
          azure:
            servicebus:
              connection-string: ${AZURE_SERVICE_BUS_CONNECTION_STRING}
              entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
      
    • Yönetilen kimlik olarak kimlik bilgileri için application.yml dosyanızda aşağıdaki özellikleri yapılandırın:

      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}
      

Uyarı

tenant-idiçin aşağıdaki değerlere izin verilir: common, organizations, consumersveya kiracı kimliği. Bu değerler hakkında daha fazla bilgi için, Hata AADSTS50020 - Kimlik sağlayıcısından kullanıcı hesabı kiracımevcut değil bölümünün Yanlış uç nokta (kişisel ve kuruluş hesapları) kullanıldı bölümüne bakın. Tek kiracılı uygulamanızı dönüştürme hakkında bilgi için bkz. Tek kiracılı uygulamayı Microsoft Entra IDüzerinde çok kiracılıya dönüştürme.

  • Hizmet sorumlusu olarak kimlik bilgileri için application.yml dosyanızda aşağıdaki özellikleri yapılandırın:

    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}
    

Uyarı

tenant-idiçin aşağıdaki değerlere izin verilir: common, organizations, consumersveya kiracı kimliği. Bu değerler hakkında daha fazla bilgi için, Hata AADSTS50020 - Kimlik sağlayıcısından kullanıcı hesabı kiracımevcut değil bölümünün Yanlış uç nokta (kişisel ve kuruluş hesapları) kullanıldı bölümüne bakın. Tek kiracılı uygulamanızı dönüştürme hakkında bilgi için bkz. Tek kiracılı uygulamayı Microsoft Entra IDüzerinde çok kiracılıya dönüştürme.

  1. ServiceBusTemplate otomatik olarak yapılandırılır ve aşağıdaki örnekte gösterildiği gibi, doğrudan kendi bean'lerinize otomatik olarak bağlayabilirsiniz:

    @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();
        }
    
    }
    

Azure Service Bus'tan ileti alma

İletileri almak için aşağıdaki adımları kullanın:

  1. Kimlik bilgisi yapılandırma seçeneklerini doldurun.

  2. @EnableAzureMessaging ek açıklamasını ekleyin; bu, @ServiceBusListener ile ek açıklanmış yöntemlerin keşfedilmesini tetikler ve arka planda mesaj dinleyici kapsayıcısını oluşturur.

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

    Uyarı

    Tekrarı önlemek için, 5.21.0 sürümünden itibaren Spring Cloud Azure Otomatik Yapılandırma anotasyonu @EnableAzureMessaging otomatik olarak etkinleştirilmiştir.

  3. ServiceBus altyapısı mevcut olduğunda, dinleyici uç noktası oluşturmak için @ServiceBusListener ile herhangi bir fasulyeye açıklama ekleyebilirsiniz. Aşağıdaki bileşen, QUEUE_NAME kuyruğunda bir dinleyici uç noktası oluşturur:

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

Service Bus istemci özelliklerini özelleştirme

Geliştiriciler Service Bus İstemcisi özelliklerini özelleştirmek için AzureServiceClientBuilderCustomizer kullanabilir. Aşağıdaki örnek, sessionIdleTimeoutiçindeki ServiceBusClientBuilder özelliğini özelleştirmektedir:

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

Örnekler

Daha fazla bilgi için GitHub'daki azure-spring-boot-samples depoya bakın.