Partilhar via


Spring Cloud Stream com Azure Service Bus

Este artigo demonstra como usar o Spring Cloud Stream Binder para enviar mensagens e receber mensagens de Service Bus queues e topics.

Azure fornece uma plataforma de mensagens assíncronas chamada Azure Service Bus ("Service Bus") baseada no padrão Advanced Message Queueing Protocol 1.0 ("AMQP 1.0"). O Service Bus pode ser utilizado em toda a gama de plataformas Azure suportadas.

Pré-requisitos

  • Uma subscrição do Azure - crie uma gratuitamente.

  • Kit de Desenvolvimento Java (JDK) versão 8 ou superior.

  • Apache Maven, versão 3.2 ou superior.

  • cURL ou um utilitário HTTP semelhante para testar a funcionalidade.

  • Uma fila ou tópico para Azure Service Bus. Se não tiveres uma, cria uma fila Service Bus ou cria um tópico Service Bus.

  • Um aplicativo Spring Boot. Se você não tiver um, crie um projeto Maven com o Spring Initializr. Certifique-se de selecionar Maven Project e, em Dependências, adicione as dependências Spring Web e Azure Support, depois selecione Java versão 8 ou superior.

Nota

Para dar acesso à sua conta aos seus recursos de Azure Service Bus, atribua as funções Azure Service Bus Data Sender e Azure Service Bus Data Receiver à conta Microsoft Entra que está a usar atualmente. Para mais informações sobre a concessão de funções de acesso, consulte Atribuir funções do Azure usando o portal Azure e Autenticar e autorizar uma aplicação com o Microsoft Entra ID para aceder a entidades do Azure Service Bus.

Importante

O Spring Boot versão 2.5 ou superior é necessário para concluir as etapas neste artigo.

Enviar e receber mensagens do Azure Service Bus

Com uma fila ou um tópico para o Azure Service Bus, pode enviar e receber mensagens usando o Spring Cloud Azure Stream Binder Service Bus.

Para instalar o módulo Spring Cloud Azure Stream Binder Service Bus, adicione as seguintes dependências ao seu ficheiro pom.xml:

  • A Lista de Materiais Spring Cloud Azure (BOM):

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>7.1.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    Nota

    Se estiveres a usar o Spring Boot 4.0.x, certifica-te de definir a spring-cloud-azure-dependencies versão para 7.1.0.

    Se estiveres a usar o Spring Boot 3.5.x, certifica-te de definir a spring-cloud-azure-dependencies versão para 6.1.0.

    Se estiveres a usar o Spring Boot 3.1.x-3.5.x, certifica-te de definir a spring-cloud-azure-dependencies versão para 5.25.0.

    Se você estiver usando o Spring Boot 2.x, certifique-se de definir a versão spring-cloud-azure-dependencies como 4.20.0.

    Esta lista de materiais (BOM) deve ser configurada na seção <dependencyManagement> do seu arquivo pom.xml. Isto garante que todas as dependências do Spring Cloud Azure usam a mesma versão.

    Para mais informações sobre a versão usada nesta BOM, consulte Qual Versão do Spring Cloud Azure Devo Usar.

  • O artefato Spring Cloud Azure Stream Binder Service Bus:

    <dependency>
         <groupId>com.azure.spring</groupId>
         <artifactId>spring-cloud-azure-stream-binder-servicebus</artifactId>
    </dependency>
    

Codificar a aplicação

Use os seguintes passos para configurar a sua aplicação a usar uma fila ou um tópico do Service Bus para enviar e receber mensagens.

  1. Configure as credenciais de Service Bus no ficheiro de configuração application.properties.

     spring.cloud.azure.servicebus.namespace=${AZURE_SERVICEBUS_NAMESPACE}
     spring.cloud.stream.bindings.consume-in-0.destination=${AZURE_SERVICEBUS_QUEUE_NAME}
     spring.cloud.stream.bindings.supply-out-0.destination=${AZURE_SERVICEBUS_QUEUE_NAME}
     spring.cloud.stream.servicebus.bindings.consume-in-0.consumer.auto-complete=false
     spring.cloud.stream.servicebus.bindings.supply-out-0.producer.entity-type=queue
     spring.cloud.function.definition=consume;supply;
     spring.cloud.stream.poller.fixed-delay=60000 
     spring.cloud.stream.poller.initial-delay=0
    

    A tabela a seguir descreve os campos na configuração:

    Campo Descrição
    spring.cloud.azure.servicebus.namespace Especifique o namespace que obteve no seu Service Bus a partir do portal Azure.
    spring.cloud.stream.bindings.consume-in-0.destination Especifique a fila do Service Bus ou o tópico do Service Bus que usou neste tutorial.
    spring.cloud.stream.bindings.supply-out-0.destination Especifique o mesmo valor utilizado para o destino de entrada.
    spring.cloud.stream.servicebus.bindings.consume-in-0.consumer.auto-complete Especifique se as mensagens devem ser processadas automaticamente. Se definido como false, um cabeçalho de mensagem de Checkpointer será adicionado para permitir que os desenvolvedores gerenciem as mensagens manualmente.
    spring.cloud.stream.servicebus.bindings.supply-out-0.producer.entity-type Especifique o tipo de entidade para a ligação de saída, pode ser queue ou topic.
    spring.cloud.function.definition Especifique o bean funcional que deve ser associado ao(s) destino(s) externo(s) exposto(s) pelas associações.
    spring.cloud.stream.poller.fixed-delay Especifique o atraso fixo para o poller padrão em milissegundos. O valor predefinido é 1000 L. O valor recomendado é 60000.
    spring.cloud.stream.poller.initial-delay Especifique o atraso inicial para gatilhos periódicos. O valor predefinido é 0.
  2. Edite o arquivo de classe de inicialização para mostrar o seguinte conteúdo.

    import com.azure.spring.messaging.checkpoint.Checkpointer;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    import org.springframework.messaging.Message;
    import org.springframework.messaging.support.MessageBuilder;
    import reactor.core.publisher.Flux;
    import reactor.core.publisher.Sinks;
    import java.util.function.Consumer;
    import java.util.function.Supplier;
    import static com.azure.spring.messaging.AzureHeaders.CHECKPOINTER;
    
    @SpringBootApplication
    public class ServiceBusQueueBinderApplication implements CommandLineRunner {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(ServiceBusQueueBinderApplication.class);
        private static final Sinks.Many<Message<String>> many = Sinks.many().unicast().onBackpressureBuffer();
    
        public static void main(String[] args) {
            SpringApplication.run(ServiceBusQueueBinderApplication.class, args);
        }
    
        @Bean
        public Supplier<Flux<Message<String>>> supply() {
            return ()->many.asFlux()
                           .doOnNext(m->LOGGER.info("Manually sending message {}", m))
                           .doOnError(t->LOGGER.error("Error encountered", t));
        }
    
        @Bean
        public Consumer<Message<String>> consume() {
            return message->{
                Checkpointer checkpointer = (Checkpointer) message.getHeaders().get(CHECKPOINTER);
                LOGGER.info("New message received: '{}'", message.getPayload());
                checkpointer.success()
                            .doOnSuccess(s->LOGGER.info("Message '{}' successfully checkpointed", message.getPayload()))
                            .doOnError(e->LOGGER.error("Error found", e))
                            .block();
            };
        }
    
        @Override
        public void run(String... args) {
            LOGGER.info("Going to add message {} to Sinks.Many.", "Hello World");
            many.emitNext(MessageBuilder.withPayload("Hello World").build(), Sinks.EmitFailureHandler.FAIL_FAST);
        }
    
    }
    

    Gorjeta

    Neste tutorial, não há operações de autenticação nas configurações ou no código. No entanto, a ligação aos serviços do Azure requer autenticação. Para completar a autenticação, precisa de usar o Azure Identity. O Spring Cloud Azure utiliza DefaultAzureCredential, que a biblioteca Azure Identity fornece para te ajudar a obter credenciais sem quaisquer alterações de código.

    DefaultAzureCredential Suporta vários métodos de autenticação e determina qual método usar em tempo de execução. Essa abordagem permite que seu aplicativo use diferentes métodos de autenticação em ambientes diferentes (como ambientes locais e de produção) sem implementar código específico do ambiente. Para obter mais informações, consulte DefaultAzureCredential.

    Para completar a autenticação em ambientes de desenvolvimento locais, pode usar Azure CLI, Visual Studio Code, PowerShell ou outros métodos. Para mais informações, consulte Autenticação do Azure em ambientes de desenvolvimento Java. Para completar a autenticação em ambientes de alojamento Azure, recomendamos a utilização da identidade gerida atribuída pelo utilizador. Para mais informações, consulte O que são identidades geridas para Azure recursos?

  3. Inicie a aplicação. Mensagens como o exemplo a seguir serão postadas no log do aplicativo:

    New message received: 'Hello World'
    Message 'Hello World' successfully checkpointed
    

Próximos passos