Compartir a través de


Compatibilidad de Spring Cloud azure con Spring Messaging Azure Service Bus

En este artículo se describe cómo puede usar Spring Cloud Azure y Spring Messaging Azure Service Bus. Spring Framework proporciona una amplia compatibilidad con la integración con sistemas de mensajería.

Azure Service Bus con Spring Messaging

Conceptos clave

Azure Service Bus es un agente de mensajes empresarial totalmente administrado que incluye colas de mensajes y temas que se pueden publicar y a los que es posible suscribirse. El proyecto Spring Messaging para Azure Service Bus aplica conceptos básicos de Spring al desarrollo de soluciones de mensajería basadas en Bus de servicio. Proporciona una plantilla de como una abstracción de alto nivel para enviar mensajes. También proporciona compatibilidad con poJOs controlados por mensajes con anotaciones de @ServiceBusListener y un contenedor de escucha de . Estas bibliotecas promueven el uso de la inserción de dependencias y la configuración declarativa. En todos estos casos, puede ver similitudes con la compatibilidad con JMS en la compatibilidad con Spring Framework y RabbitMQ en Spring AMQP.

Configuración de dependencias

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

Configuración

La biblioteca proporciona las siguientes opciones de configuración para ServiceBusTemplate y @ServiceBusListener:

Propiedad Tipo Descripción
spring.cloud.azure.message-converter.isolated-object-mapper booleano Si se usa un bean de ObjectMapper aislado para el convertidor de mensajes de Service Bus. Habilitado de forma predeterminada.
spring.cloud.azure.servicebus.enabled booleano Indica si una instancia de Azure Service Bus está habilitada.
spring.cloud.azure.servicebus.connection-string Cuerda Valor de cadena de conexión del espacio de nombres de Service Bus.
spring.cloud.azure.servicebus.custom-endpoint-address Cuerda Dirección del punto de conexión personalizado que se va a usar al conectarse a Service Bus.
espacio de nombres spring.cloud.azure.servicebus.namespace Cuerda Valor del espacio de nombres de Service Bus, que es el prefijo del FQDN. Un FQDN debe estar compuesto por NamespaceName.DomainName
spring.cloud.azure.servicebus.entity-type Cuerda Tipo de entidad de Azure Service Bus.

Uso básico

Convertidor de mensajes de Service Bus personalizado

Hay dos maneras de configurar el convertidor de mensajes de Service Bus:

  • Configure la siguiente propiedad para que el convertidor de mensajes predeterminado de Service Bus use un ObjectMapper bean, que puede ser el bean personalizado ObjectMapper o uno administrado por Spring Boot:

    spring:
      cloud:
        azure:
          message-converter:
            isolated-object-mapper: false
    
  • Defina directamente el bean del convertidor de mensajes de Service Bus:

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

Envío de mensajes a Azure Service Bus

Siga estos pasos para enviar mensajes:

  1. Rellene las opciones de configuración de credenciales mediante uno de los métodos siguientes:

    • Para las credenciales como DefaultAzureCredential, configure las siguientes propiedades en el archivo application.yml:

      spring:
        cloud:
          azure:
            servicebus:
              namespace: ${AZURE_SERVICE_BUS_NAMESPACE}
              entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
      
    • Para las credenciales como cadena de conexión, configure las siguientes propiedades en el archivo application.yml:

      spring:
        cloud:
          azure:
            servicebus:
              connection-string: ${AZURE_SERVICE_BUS_CONNECTION_STRING}
              entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
      
    • Para las credenciales como identidades administradas, configure las siguientes propiedades en el archivo application.yml:

      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:

Se permiten los siguientes valores para tenant-id: common, organizations, consumerso el identificador de inquilino. Para obtener más información sobre estos valores, consulte la sección Uso del punto de conexión incorrecto (cuentas personales y de organización) de Error AADSTS50020: la cuenta de usuario del proveedor de identidades no existe en el inquilino. Para obtener información sobre cómo convertir su aplicación de un solo inquilino a multiinquilino, consulte Convertir aplicación de un solo inquilino a multiinquilino en Microsoft Entra ID.

  • Para las credenciales como entidad de servicio, configure las siguientes propiedades en el archivo application.yml:

    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:

Se permiten los siguientes valores para tenant-id: common, organizations, consumerso el identificador de inquilino. Para obtener más información sobre estos valores, consulte la sección Uso del punto de conexión incorrecto (cuentas personales y de organización) de Error AADSTS50020: la cuenta de usuario del proveedor de identidades no existe en el inquilino. Para obtener información sobre cómo convertir su aplicación de un solo inquilino a multiinquilino, consulte Convertir aplicación de un solo inquilino a multiinquilino en Microsoft Entra ID.

  1. ServiceBusTemplate está configurado automáticamente y puede conectarlo directamente a sus propios frijoles, como se muestra en el ejemplo siguiente:

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

Recepción de mensajes de Azure Service Bus

Siga estos pasos para recibir mensajes:

  1. Rellene las opciones de configuración de credenciales.

  2. Agregue la anotación @EnableAzureMessaging, que desencadena la detección de métodos anotados con @ServiceBusListener, creando el contenedor del agente de escucha de mensajes en segundo plano.

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

    Nota:

    Para evitar la repetición, ya que la versión 5.21.0, Spring Cloud Azure Auto-configure la anotación @EnableAzureMessaging habilitada automáticamente.

  3. Cuando la infraestructura de ServiceBus está presente, puede anotar cualquier bean con @ServiceBusListener para crear un punto de conexión del agente de escucha. El componente siguiente crea un punto de conexión del agente de escucha en la cola de QUEUE_NAME:

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

Personalización de las propiedades del cliente de Service Bus

Los desarrolladores pueden usar AzureServiceClientBuilderCustomizer para personalizar las propiedades del cliente de Service Bus. En el ejemplo siguiente se personaliza la propiedad sessionIdleTimeout en ServiceBusClientBuilder:

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

Muestras

Para más información, consulte el repositorio de azure-spring-boot-samples en GitHub.