Partilhar via


Use Azure Service Bus with JMS

Este artigo descreve como usar o Azure Service Bus com a API JMS integrada no framework Spring JMS.

Principais características

Ligação sem palavra-passe

A ligação sem palavra-passe utiliza autenticação Microsoft Entra para se ligar aos serviços do Azure sem armazenar quaisquer credenciais na aplicação, nos seus ficheiros de configuração ou nas variáveis do ambiente. A autenticação Microsoft Entra é um mecanismo para ligar ao Azure Service Bus utilizando identidades definidas no Microsoft Entra ID. Com a autenticação Microsoft Entra, pode gerir o Service Bus e outros serviços Microsoft Services numa localização central, o que simplifica a gestão de permissões.

Como funciona

O Spring Cloud Azure constrói primeiro um dos seguintes tipos de credenciais, dependendo da configuração de autenticação da aplicação:

  • ClientSecretCredential
  • ClientCertificateCredential
  • UsernamePasswordCredential
  • ManagedIdentityCredential

Se nenhum desses tipos de credenciais for encontrado, a cadeia de credenciais via DefaultTokenCredential será usada para obter credenciais de propriedades de aplicativos, variáveis de ambiente, identidade gerenciada ou IDEs. Para mais informações, consulte Spring Cloud.

Configuração de dependência

Adicione as seguintes dependências se quiser migrar a sua aplicação Spring JMS para usar o Azure Service Bus.

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

Configuração

A tabela a seguir descreve as propriedades configuráveis ao usar o suporte ao Spring JMS:

Propriedade Descrição
spring.jms.servicebus.connection-string A Azure Service Bus cadeia de ligação, para quando quiser fornecer o cadeia de ligação diretamente.
spring.jms.servicebus.topic-client-id O ID do cliente JMS. Só funciona para o feijão topicJmsListenerContainerFactory.
spring.jms.servicebus.enabled Um valor que indica se deve ativar a autoconfiguração do Service Bus JMS. O valor padrão é true.
spring.jms.servicebus.idle-timeout A duração do timeout de inatividade da ligação indica quanto tempo o cliente espera que o Service Bus mantenha a ligação ativa quando não são entregues mensagens. O valor padrão é 2m.
spring.jms.servicebus.passwordless-enabled Se ativar passwordless para Azure Service Bus JMS. O valor padrão é false.
spring.jms.servicebus.pricing-tier The Azure Service Bus Price Tier. Os valores suportados são premium e standard. O nível premium usa o Java Message Service (JMS) 2.0, enquanto o nível padrão usa o JMS 1.1 para interagir com o Azure Service Bus.
spring.jms.servicebus.listener.reply-pub-sub-domain Um valor que indica se o tipo de destino da resposta é um tópico. Só funciona para o feijão topicJmsListenerContainerFactory.
spring.jms.servicebus.listener.phase A fase em que este recipiente deve ser iniciado e parado.
spring.jms.servicebus.listener.reply-qos-settings Configura o QosSettings a ser usado ao enviar uma resposta.
spring.jms.servicebus.listener.subscription-durable Um valor que indica se a assinatura deve ser durável. Só funciona para o feijão topicJmsListenerContainerFactory. O valor padrão é true.
spring.jms.servicebus.listener.subscription-shared Um valor que indica se a assinatura deve ser compartilhada. Só funciona para o feijão topicJmsListenerContainerFactory.
spring.jms.servicebus.pool.block-if-full Um valor que indica se uma conexão deve ser bloqueada e o pool está cheio. Defina como false para lançar um JMSException em vez disso.
spring.jms.servicebus.pool.block-if-full-timeout O período de bloqueio antes de lançar uma exceção se a piscina ainda estiver cheia.
spring.jms.servicebus.pool.enabled Um valor que indica se um JmsPoolConnectionFactory deve ser criado, em vez de um ConnectionFactoryregular.
spring.jms.servicebus.pool.idle-timeout O tempo limite ocioso do pool de conexões.
spring.jms.servicebus.pool.max-connections O número máximo de conexões agrupadas.
spring.jms.servicebus.pool.max-sessions-per-connection O número máximo de sessões em pool por conexão no pool.
spring.jms.servicebus.pool.time-between-expiration-check O tempo para dormir entre as execuções do fio de despejo de conexão ociosa. Quando negativo, nenhum thread de remoção de conexão ociosa é executado.
spring.jms.servicebus.pool.use-anonymous-producers Um valor que indica se deve usar apenas uma instância MessageProducer anônima. Defina-o como false para criar um MessageProducer sempre que for necessário.
spring.jms.servicebus.prefetch-policy.all O valor de reserva para a opção de prefetch neste namespace do Service Bus. O valor padrão é 0.
spring.jms.servicebus.prefetch-policy.durable-topic-prefetch O número de pré-busca para tópico durável. O valor padrão é 0.
spring.jms.servicebus.prefetch-policy.queue-browser-prefetch O número de pré-busca para o navegador de fila. O valor padrão é 0.
spring.jms.servicebus.prefetch-policy.queue-prefetch O número de pré-busca para fila. O valor padrão é 0.
spring.jms.servicebus.prefetch-policy.topic-prefetch O número de pré-busca por tópico. O valor padrão é 0.

Observação

A configuração geral do Spring JMS é omitida para abreviar.

Para obter mais informações, consulte Spring JMS Document.

Utilização básica

Conectar-se ao Azure Service Bus JMS usando passwordless

Configure as seguintes propriedades no arquivo application.yml:

spring:
  jms:
    servicebus:
      namespace: ${AZURE_SERVICEBUS_NAMESPACE}
      pricing-tier: ${PRICING_TIER}
      passwordless-enabled: true

Importante

O Azure Service Bus JMS suporta a utilização do Microsoft Entra ID para autorizar pedidos a recursos do Service Bus. Com Microsoft Entra ID, certifique-se de que atribuiu a função Azure Service Bus Proprietário dos Dados à conta Microsoft Entra que está a usar atualmente. Para mais informações, consulte Atribuir Azure funções usando o portal Azure.

Connect to Azure Service Bus with JMS use Managed Identity

  1. Para usar a identidade gerida, ative a identidade gerida para o seu serviço e atribua o papel Azure Service Bus Data Owner. Para mais informações, consulte Autenticar uma identidade gerida com Microsoft Entra ID para aceder a Azure Service Bus recursos.

  2. Configure as seguintes propriedades no arquivo application.yml:

    spring:
      cloud:
        azure:
          credential:
            managed-identity-enabled: true
      jms:
        servicebus:
          namespace: ${AZURE_SERVICEBUS_NAMESPACE}
          pricing-tier: ${PRICING_TIER}
          passwordless-enabled: true
    

    Importante

    Se você estiver usando a identidade gerenciada atribuída pelo usuário, também precisará adicionar a propriedade spring.cloud.azure.credential.client-id com sua ID de cliente de identidade gerenciada atribuída pelo usuário.

Conectar-se ao Azure Service Bus JMS usando cadeia de ligação

Adicione as seguintes propriedades e pronto.

spring:
  jms:
    servicebus:
      connection-string: ${AZURE_SERVICEBUS_CONNECTION_STRING}
      pricing-tier: ${PRICING_TIER}

Observação

A Microsoft recomenda utilizar o fluxo de autenticação mais seguro disponível. O fluxo de autenticação descrito neste procedimento, como para bancos de dados, caches, mensagens ou serviços de IA, requer um grau muito alto de confiança no aplicativo e traz riscos não presentes em outros fluxos. Use esse fluxo somente quando opções mais seguras, como identidades gerenciadas para conexões sem senha ou sem chave, não forem viáveis. Para operações de máquina local, prefira identidades de usuário para conexões sem senha ou sem chave.

Conexões

O Spring Cloud Azure fornece as seguintes três opções de Connection Factory para ligação ao Azure Service Bus JMS:

  • JmsPoolConnectionFactory: Esta fábrica mantém um pool de ligações com opções personalizáveis como spring.jms.servicebus.pool.max-connections. Mais definições de configuração do pool - com o prefixo spring.jms.servicebus.pool. - são detalhadas na secção de Configuração . Esta configuração melhora o desempenho ao utilizar a capacidade de balanceamento de carga do Azure Service Bus, distribuindo o tráfego entre múltiplos endpoints.

  • CachingConnectionFactory: Esta fábrica reutiliza uma única ligação para todas as chamadas para JmsTemplate, reduzindo a sobrecarga da criação da ligação, o que é ideal para cenários de baixo tráfego. No entanto, este modo não utiliza a capacidade de balanceamento de carga do Azure Service Bus.

  • ServiceBusJmsConnectionFactory: Neste modo, cada chamada para JmsTemplate cria uma nova ligação, que pode ser intensiva em recursos e menos eficiente.

Quando as três classes existem no caminho de classe, qual é usada? A tabela seguinte descreve quais são usados com base nas propriedades de configuração (desde Spring Cloud Azure 7.2.0 e 6.2.0):

spring.jms.servicebus.pool.enabled spring.jms.cache.enabled Remetente ConnectionFactory Contentor de Ouvintes ConnectionFactory
não definido não definido CachingConnectionFactory ServiceBusJmsConnectionFactory
não definido true CachingConnectionFactory CachingConnectionFactory
não definido false ServiceBusJmsConnectionFactory ServiceBusJmsConnectionFactory
true não definido JmsPoolConnectionFactory JmsPoolConnectionFactory
true true CachingConnectionFactory CachingConnectionFactory
true false JmsPoolConnectionFactory JmsPoolConnectionFactory
false não definido CachingConnectionFactory ServiceBusJmsConnectionFactory
false true CachingConnectionFactory CachingConnectionFactory
false false ServiceBusJmsConnectionFactory ServiceBusJmsConnectionFactory

Observação

A tabela seguinte mostra o ConnectionFactory predefinido quando tanto spring.jms.servicebus.pool.enabled como spring.jms.cache.enabled não estão definidos para diferentes versões do Spring Cloud Azure:

Spring Cloud Azure versão Remetente ConnectionFactory Contentor de ouvinte ConnectionFactory
>= 6.2.0 ou >= 7.2.0 CachingConnectionFactory ServiceBusJmsConnectionFactory
6.1.0 e 7.0.0 ServiceBusJmsConnectionFactory ServiceBusJmsConnectionFactory
<= 6.1.0 JmsPoolConnectionFactory JmsPoolConnectionFactory

Amostras

Para mais informações, consulte o repositório azure-spring-boot-samples no GitHub.