Поделиться через


Используйте Azure Service Bus в приложениях Spring

В этой статье показано, как использовать Служебная шина Azure в приложениях Java, созданных с помощью Spring Framework.

Azure предоставляет асинхронную платформу обмена сообщениями с именем Служебная шина Azure (служебная шина), которая основана на стандарте Расширенного протокола очереди сообщений 1.0 (AMQP 1.0). Вы можете использовать службу шины сообщений на поддерживаемых платформах Azure.

Spring Cloud Azure предоставляет различные модули для отправки и получения сообщений из очередей и тем в служебной шине, а также из подписок, используя платформы Spring.

Для разных вариантов использования можно использовать следующие модули независимо или объединить их.

Предварительные условия

Примечание.

Чтобы предоставить вашей учетной записи доступ к ресурсам шины сообщений, в вновь созданном пространстве имен Azure Service Bus назначьте роли Azure Service Bus Data Sender и Azure Service Bus Data Receiver учетной записи Microsoft Entra, которую вы используете в данный момент. Дополнительные сведения см. в разделе Назначение ролей Azure с помощью портала Azure.

Внимание

Для выполнения действий, описанных в этом руководстве, требуется Spring Boot версии 2.5 или более поздней.

Подготовьте локальную среду

В этом руководстве конфигурации и код не имеют никаких операций проверки подлинности. Однако для подключения к службе Azure требуется проверка подлинности. Чтобы завершить проверку подлинности, необходимо использовать клиентская библиотека удостоверений Azure. Spring Cloud Azure использует DefaultAzureCredential библиотеку Azure Identity, чтобы помочь вам получить учетные данные без изменений в коде.

DefaultAzureCredential поддерживает несколько методов проверки подлинности и определяет, какой метод следует использовать во время выполнения. Этот подход позволяет приложению использовать различные методы проверки подлинности в разных средах, таких как локальные или рабочие среды, без реализации кода для конкретной среды. Для получения дополнительной информации см. раздел DefaultAzureCredential в документе Аутентификация Java-приложений, размещенных в Azure.

Чтобы использовать Azure CLI, IntelliJ или другие методы для выполнения проверки подлинности в локальных средах разработки, ознакомьтесь с проверкой подлинности Azure в средах разработки Java. Чтобы завершить проверку подлинности в средах размещения Azure, рекомендуется использовать управляемое удостоверение. Для получения дополнительной информации см. Что такое управляемые удостоверения для ресурсов Azure.

Примечание.

Служебная шина Azure для API JMS в настоящее время не поддерживаетсяDefaultAzureCredential. Если вы используете Spring JMS с Service Bus, пропустите этот шаг.

Используйте стартер Spring Cloud Azure для Служебной шины

Модуль Spring Cloud Azure Service Bus Starter импортирует библиотеку клиента Java для служебной шины с использованием платформы Spring Boot. Вы можете использовать Spring Cloud Azure и Azure SDK вместе, не исключая друг друга. Таким образом, вы можете продолжать использовать Java API клиента Служебной шины в вашем приложении Spring.

Добавьте зависимость Service Bus

Чтобы установить модуль Spring Cloud Azure Service Bus Starter, добавьте в файл pom.xml следующие зависимости:

  • Спецификация материалов Spring Cloud Azure (BOM):

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

    Примечание.

    Если вы используете Spring Boot 2.x, обязательно установите spring-cloud-azure-dependencies версию на 4.20.0. Этот счет материалов (BOM) должен быть настроен в <dependencyManagement> разделе pom.xml файла. Это гарантирует, что все зависимости Spring Cloud Azure используют одну и ту же версию. Дополнительные сведения о версии, используемой для этого BOM, см. в статье "Какая версия Spring Cloud Azure должна использоваться".

  • Артефакт Spring Cloud Azure Service Bus:

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

Код приложения для отправки и получения сообщений

В этом руководстве описано, как использовать шину сервисов с клиентами Java в контексте приложения Spring. Здесь мы представляем две альтернативы. Рекомендуется использовать автоматическую настройку Spring Boot и использовать встроенные клиенты из контекста Spring. Альтернативным способом является создание клиентов с помощью программирования.

Первый способ, который включает автоматическое связывание клиентских бинов из контейнера Spring IoC, имеет следующие преимущества при сравнении со вторым способом. Эти преимущества обеспечивают более гибкий и эффективный опыт при разработке с клиентами Service Bus.

  • Вы можете использовать внешнюю конфигурацию , чтобы работать с одинаковым кодом приложения в разных средах.

  • Вы можете поручить процесс изучения паттерна builder и регистрации этого клиента в контексте приложения фреймворку Spring Boot. Это делегирование позволяет сосредоточиться на использовании клиентов, учитывая ваши бизнес-требования.

  • С помощью индикатора работоспособности можно легко проверить состояние и работоспособность приложения и внутренних компонентов.

В следующем примере кода показано, как использовать ServiceBusSenderClient и ServiceBusProcessorClient с этими двумя вариантами.

Примечание.

Azure Java SDK для Service Bus предоставляет несколько клиентов для взаимодействия с Service Bus. Стартер также предоставляет автоконфигурацию для всех клиентов Service Bus и конструкторов клиентов. Здесь мы используем только ServiceBusSenderClient и ServiceBusProcessorClient в качестве примеров.

Использование автоматической настройки Spring Boot

Чтобы отправлять и получать сообщения с Service Bus, настройте приложение, выполнив следующие действия.

  1. Настройте пространство имен и очередь Service Bus, как показано в следующем примере:

    spring.cloud.azure.servicebus.namespace=<your-servicebus-namespace-name>
    spring.cloud.azure.servicebus.entity-name=<your-servicebus-queue-name>
    spring.cloud.azure.servicebus.entity-type=queue
    

    Совет

    Здесь мы используем очередь Service Bus в качестве примера. Чтобы использовать тему/подписку, необходимо добавить свойство spring.cloud.azure.servicebus.processor.subscription-name и изменить значение entity-type на topic.

  2. Создайте класс ServiceBusProcessorClientConfiguration Java, как показано в следующем примере. Этот класс используется для регистрации обработчика сообщений и ошибок ServiceBusProcessorClient.

    @Configuration(proxyBeanMethods = false)
    public class ServiceBusProcessorClientConfiguration {
    
        @Bean
        ServiceBusRecordMessageListener processMessage() {
            return context -> {
                ServiceBusReceivedMessage message = context.getMessage();
                System.out.printf("Processing message. Id: %s, Sequence #: %s. Contents: %s%n", message.getMessageId(),
                        message.getSequenceNumber(), message.getBody());
            };
        }
    
        @Bean
        ServiceBusErrorHandler processError() {
            return context -> {
                System.out.printf("Error when receiving messages from namespace: '%s'. Entity: '%s'%n",
                        context.getFullyQualifiedNamespace(), context.getEntityPath());
            };
        }
    }
    
  3. Внедрите ServiceBusSenderClient в ваше Spring-приложение и вызовите соответствующие API для отправки сообщений, как показано в следующем примере:

    @SpringBootApplication
    public class ServiceBusQueueApplication implements CommandLineRunner {
    
        private final ServiceBusSenderClient senderClient;
    
        public ServiceBusQueueApplication(ServiceBusSenderClient senderClient) {
            this.senderClient = senderClient;
        }
    
        public static void main(String[] args) {
            SpringApplication.run(ServiceBusQueueApplication.class, args);
        }
    
        @Override
        public void run(String... args) throws Exception {
            // send one message to the queue
            senderClient.sendMessage(new ServiceBusMessage("Hello, World!"));
            System.out.printf("Sent a message to the queue");
            senderClient.close();
    
            // wait the processor client to consume messages
            TimeUnit.SECONDS.sleep(10);
        }
    
    }
    

    Примечание.

    По умолчанию жизненный цикл автосвязываемого компонента ServiceBusProcessorClient управляется контекстом фреймворка Spring. Обработчик автоматически запускается при запуске контекста приложения Spring и останавливается при остановке контекста приложения Spring. Чтобы отключить эту функцию, настройте spring.cloud.azure.servicebus.processor.auto-startup=false.

  4. Запустите приложение. Вы видите журналы, аналогичные следующему примеру:

    Sent a message to the queue
    Processing message. Id: 6f405435200047069a3caf80893a80bc, Sequence #: 1. Contents: Hello, World!
    

Создание клиентов Service Bus программным образом

Вы можете создать эти клиентские бины самостоятельно, но процесс сложный. В приложениях Spring Boot необходимо управлять свойствами, изучать шаблон построителя и регистрировать клиент в контексте приложения Spring. В следующем примере кода показано, как это сделать:

  1. Создайте класс ServiceBusClientConfiguration Java, как показано в следующем примере. Этот класс используется для объявления компонентов ServiceBusSenderClient и ServiceBusProcessorClient.

    @Configuration(proxyBeanMethods = false)
    public class ServiceBusClientConfiguration {
    
        private static final String SERVICE_BUS_FQDN = "<service-bus-fully-qualified-namespace>";
        private static final String QUEUE_NAME = "<service-bus-queue-name>";
    
        @Bean
        ServiceBusClientBuilder serviceBusClientBuilder() {
            return new ServiceBusClientBuilder()
                       .fullyQualifiedNamespace(SERVICE_BUS_FQDN)
                       .credential(new DefaultAzureCredentialBuilder().build());
        }
    
        @Bean
        ServiceBusSenderClient serviceBusSenderClient(ServiceBusClientBuilder builder) {
            return builder
                   .sender()
                   .queueName(QUEUE_NAME)
                   .buildClient();
        }
    
        @Bean
        ServiceBusProcessorClient serviceBusProcessorClient(ServiceBusClientBuilder builder) {
            return builder.processor()
                          .queueName(QUEUE_NAME)
                          .processMessage(ServiceBusClientConfiguration::processMessage)
                          .processError(ServiceBusClientConfiguration::processError)
                          .buildProcessorClient();
        }
    
        private static void processMessage(ServiceBusReceivedMessageContext context) {
            ServiceBusReceivedMessage message = context.getMessage();
            System.out.printf("Processing message. Id: %s, Sequence #: %s. Contents: %s%n",
                message.getMessageId(), message.getSequenceNumber(), message.getBody());
        }
    
        private static void processError(ServiceBusErrorContext context) {
            System.out.printf("Error when receiving messages from namespace: '%s'. Entity: '%s'%n",
                    context.getFullyQualifiedNamespace(), context.getEntityPath());
        }
    }
    

    Примечание.

    Обязательно замените <service-bus-fully-qualified-namespace> заполнитель именем узла Service Bus из портала Azure. Замените заполнителем <service-bus-queue-name> собственное имя очереди, настроенное в вашем пространстве имен служебной шины.

  2. Внедрите клиентские компоненты в приложение, как показано в следующем примере:

    @SpringBootApplication
    public class ServiceBusQueueApplication implements CommandLineRunner {
    
        private final ServiceBusSenderClient senderClient;
    
        private final ServiceBusProcessorClient processorClient;
    
        public ServiceBusQueueApplication(ServiceBusSenderClient senderClient, ServiceBusProcessorClient processorClient) {
            this.senderClient = senderClient;
            this.processorClient = processorClient;
        }
    
        public static void main(String[] args) {
            SpringApplication.run(ServiceBusQueueApplication.class, args);
        }
    
        @Override
        public void run(String... args) throws Exception {
            // send one message to the queue
            senderClient.sendMessage(new ServiceBusMessage("Hello, World!"));
            System.out.printf("Sent a message to the queue");
            senderClient.close();
    
            System.out.printf("Starting the processor");
            processorClient.start();
            TimeUnit.SECONDS.sleep(10);
            System.out.printf("Stopping and closing the processor");
            processorClient.close();
        }
    
    }
    
  3. Запустите приложение. Вы видите журналы, аналогичные следующему примеру:

    Sent a message to the queue
    Starting the processor
    ...
    Processing message. Id: 6f405435200047069a3caf80893a80bc, Sequence #: 1. Contents: Hello, World!
    Stopping and closing the processor
    

В следующем списке показаны причины, по которым этот код не является гибким или изящным:

  • Пространство имен и имена очереди/темы/подписки жёстко закодированы.
  • Если вы используете @Value для получения конфигураций из среды Spring, в файле application.properties невозможно указать IDE.
  • Если у вас есть сценарий микросервисов, необходимо дублировать код в каждом проекте, и легко делать ошибки и сложно поддерживать согласованность.

К счастью, создание клиентских бинов самостоятельно не требуется благодаря Spring Cloud Azure. Вместо этого можно напрямую внедрить компоненты и использовать свойства конфигурации, с которыми вы уже знакомы, для настройки Service Bus.

Azure Spring Cloud также предоставляет следующие глобальные конфигурации для различных сценариев. Дополнительные сведения см. в разделе "Глобальная конфигурация для SDK службы Azure" в конфигурации Spring Cloud Azure.

  • Параметры прокси-сервера.
  • Настройки повторного выполнения.
  • Параметры клиента транспорта AMQP.

Вы также можете подключиться к разным облакам Azure. Дополнительные сведения см. в статье "Подключение к разным облакам Azure".

Использование стартера JMS в Spring Cloud Сервисная шина Azure

Модуль Spring Cloud Azure Service Bus JMS Starter обеспечивает интеграцию Spring JMS с Служебной шиной. В данном видео описывается, как интегрировать приложения на Spring JMS со служебной шиной Azure при помощи JMS 2.0.


В этом руководстве показано, как использовать Spring Cloud стартер Azure Service Bus для API JMS для отправки и получения сообщений из Служебной шины.

Добавьте зависимость Service Bus

Чтобы установить модуль Spring Cloud Azure Service Bus JMS Starter, добавьте следующие зависимости в файл pom.xml:

  • Спецификация материалов Spring Cloud Azure (BOM):

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

    Примечание.

    Если вы используете Spring Boot 2.x, обязательно установите spring-cloud-azure-dependencies версию на 4.20.0. Этот счет материалов (BOM) должен быть настроен в <dependencyManagement> разделе pom.xml файла. Это гарантирует, что все зависимости Spring Cloud Azure используют одну и ту же версию. Дополнительные сведения о версии, используемой для этого BOM, см. в статье "Какая версия Spring Cloud Azure должна использоваться".

  • Артефакт JMS Служебной шины Azure Spring Cloud:

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

Код приложения для отправки и получения сообщений

  1. Настройте строку подключения и уровень цен для Service Bus, как показано в следующем примере:

    spring.jms.servicebus.connection-string=<service-bus-namespace-connection-string>
    spring.jms.servicebus.pricing-tier=<service-bus-pricing-tier>
    
  2. Создайте приемник сообщений.

    Spring предоставляет средства для публикации сообщений в любом POJO (обычный старый объект Java). Сначала определите универсальный User класс, который хранит и извлекает имя пользователя, как показано в следующем примере:

    public class User implements Serializable {
    
        private static final long serialVersionUID = -295422703255886286L;
    
        private String name;
    
        public User() {
        }
    
        public User(String name) {
            setName(name);
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    

    Совет

    Serializable реализуется для использования метода send в JmsTemplate на платформе Spring. В противном случае следует определить настраиваемый компонент MessageConverter для сериализации содержимого в текстовом формате JSON. Дополнительные сведения о MessageConverter см. в официальном проекте Spring JMS starter.

  3. Здесь можно создать новый QueueReceiveService класс Java, как показано в следующем примере. Этот класс используется для определения приемника сообщений.

    @Component
    public class QueueReceiveService {
    
        private static final String QUEUE_NAME = "<service-bus-queue-name>";
    
        @JmsListener(destination = QUEUE_NAME, containerFactory = "jmsListenerContainerFactory")
        public void receiveMessage(User user) {
            System.out.printf("Received a message from %s.", user.getName());
        }
    }
    

    Примечание.

    Обязательно замените заполнитель <service-bus-queue-name> собственным именем очереди, настроенным в пространстве имен Service Bus.

    Если вы используете раздел или подписку, измените параметр destination на имя раздела, а containerFactory должен быть topicJmsListenerContainerFactory. Кроме того, добавьте subscription параметр, чтобы описать имя подписки.

  4. Подключите отправителя и получателя для отправки и получения сообщений с помощью Spring, как показано в следующем примере:

    @SpringBootApplication
    @EnableJms
    public class ServiceBusJmsStarterApplication {
    
        private static final String QUEUE_NAME = "<service-bus-queue-name>";
    
        public static void main(String[] args) {
            ConfigurableApplicationContext context = SpringApplication.run(ServiceBusJMSQueueApplication.class, args);
            JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);
    
            // Send a message with a POJO - the template reuse the message converter
            System.out.println("Sending a user message.");
            jmsTemplate.convertAndSend(QUEUE_NAME, new User("Tom"));
        }
    }
    

    Примечание.

    Обязательно замените заполнитель <service-bus-queue-name> собственным именем очереди, настроенным в пространстве имен Service Bus.

    Совет

    Обязательно добавьте @EnableIntegration аннотацию, которая активирует обнаружение методов, аннотированных с помощью @JmsListener, создавая контейнер прослушивателя сообщений за кулисами.

  5. Запустите приложение. Вы видите журналы, аналогичные следующему примеру:

    Sending a user message.
    Received a message from Tom.
    

Другие сведения

Дополнительные сведения см. в статье Как использовать JMS API с со служебной шиной и AMQP 1.0.

Использование Azure Service Bus для Spring Messaging

Модуль Spring Messaging для сервисной шины Azure предоставляет поддержку фреймворка Spring Messaging с использованием сервисной шины.

Если вы используете Spring Messaging для шины служб Azure, вы можете воспользоваться следующими функциями:

  • ServiceBusTemplate: отправляет сообщения в очереди и разделы Service Bus как асинхронно, так и синхронно.
  • @ServiceBusListener: пометить метод как цель для слушателя сообщений Service Bus на конечной точке.

В этом руководстве показано, как использовать Spring Messaging для Azure Service Bus для отправки сообщений и получения сообщений из Служебной шины.

Добавьте зависимость Service Bus

Чтобы установить модуль Spring Messaging Служебная шина Azure, добавьте следующие зависимости в файл pom.xml:

  • Спецификация материалов Spring Cloud Azure (BOM):

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

    Примечание.

    Если вы используете Spring Boot 2.x, обязательно установите spring-cloud-azure-dependencies версию на 4.20.0. Этот счет материалов (BOM) должен быть настроен в <dependencyManagement> разделе pom.xml файла. Это гарантирует, что все зависимости Spring Cloud Azure используют одну и ту же версию. Дополнительные сведения о версии, используемой для этого BOM, см. в статье "Какая версия Spring Cloud Azure должна использоваться".

  • Стартеры для Spring Messaging шина служебных сообщений и Spring Cloud Azure:

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

Код приложения для отправки и получения сообщений

  1. Настройте пространство имен и тип очереди для Service Bus, как показано в следующем примере:

    spring.cloud.azure.servicebus.namespace=<service-bus-namespace-name>
    spring.cloud.azure.servicebus.entity-type=queue
    

    Примечание.

    Если вы используете тему или подписку, измените значение spring.cloud.azure.servicebus.entity-type на topic.

  2. Создайте класс ConsumerService Java, как показано в следующем примере. Этот класс используется для определения приемника сообщений.

    @Service
    public class ConsumerService {
    
        private static final String QUEUE_NAME = "<service-bus-queue-name>";
    
        @ServiceBusListener(destination = QUEUE_NAME)
        public void handleMessageFromServiceBus(String message) {
            System.out.printf("Consume message: %s%n", message);
        }
    
    }
    

    Примечание.

    Если вы используете тему или подписку, измените параметр destination аннотации в качестве имени темы и добавьте параметр group, чтобы описать имя подписки.

  3. Подключите отправителя и получателя для отправки и получения сообщений с помощью Spring, как показано в следующем примере:

    @SpringBootApplication
    @EnableAzureMessaging
    public class Application {
    
        private static final String QUEUE_NAME = "<service-bus-queue-name>";
    
        public static void main(String[] args) {
            ConfigurableApplicationContext applicationContext = SpringApplication.run(Application.class);
            ServiceBusTemplate serviceBusTemplate = applicationContext.getBean(ServiceBusTemplate.class);
            System.out.println("Sending a message to the queue.");
            serviceBusTemplate.sendAsync(QUEUE_NAME, MessageBuilder.withPayload("Hello world").build()).subscribe();
        }
    }
    

    Совет

    Обязательно добавьте @EnableAzureMessaging аннотацию, которая активирует обнаружение методов, аннотированных с помощью @ServiceBusListener, создавая контейнер прослушивателя сообщений за кулисами.

  4. Запустите приложение. Вы видите журналы, аналогичные следующему примеру:

    Sending a message to the queue.
    Consume message: Hello world.
    

Использование Spring Integration для Azure Service Bus

Модуль Spring Integration Azure Service Bus предоставляет поддержку фреймворка Spring Integration с помощью Service Bus.

Если ваше приложение Spring использует каналы сообщений Spring Integration, можно направлять сообщения между этими каналами и служебной шиной с помощью адаптеров каналов.

Адаптер входящего канала пересылает сообщения из очереди или подписки Service Bus в канал сообщений. Адаптер исходящего канала публикует сообщения из канала сообщений в очередь и тему в Service Bus.

В этом руководстве показано, как использовать Spring Integration с Azure Service Bus для отправки и получения сообщений из шины Service Bus.

Добавьте зависимость Service Bus

Чтобы установить модуль интеграции Spring Cloud Azure Service Bus Starter, добавьте следующие зависимости в файл pom.xml:

  • Спецификация материалов Spring Cloud Azure (BOM):

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

    Примечание.

    Если вы используете Spring Boot 2.x, обязательно установите spring-cloud-azure-dependencies версию на 4.20.0. Этот счет материалов (BOM) должен быть настроен в <dependencyManagement> разделе pom.xml файла. Это гарантирует, что все зависимости Spring Cloud Azure используют одну и ту же версию. Дополнительные сведения о версии, используемой для этого BOM, см. в статье "Какая версия Spring Cloud Azure должна использоваться".

  • Артефакт интеграции Spring Cloud Сервисная шина Azure

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

Код приложения для отправки и получения сообщений

  1. Настройте пространство имен для Service Bus, как показано в следующем примере:

    spring.cloud.azure.servicebus.namespace=<your-servicebus-namespace-name>
    
  2. Создайте класс QueueReceiveConfiguration Java, как показано в следующем примере. Этот класс используется для определения приемника сообщений.

    @Configuration
    public class QueueReceiveConfiguration {
    
        private static final String INPUT_CHANNEL = "queue.input";
        private static final String QUEUE_NAME = "<your-servicebus-queue-name>";
        private static final String SERVICE_BUS_MESSAGE_LISTENER_CONTAINER = "queue-listener-container";
    
        /**
         * This message receiver binding with {@link ServiceBusInboundChannelAdapter}
         * via {@link MessageChannel} has name {@value INPUT_CHANNEL}
         */
        @ServiceActivator(inputChannel = INPUT_CHANNEL)
        public void messageReceiver(byte[] payload) {
            String message = new String(payload);
            System.out.printf("New message received: '%s'%n", message);
        }
    
        @Bean(SERVICE_BUS_MESSAGE_LISTENER_CONTAINER)
        public ServiceBusMessageListenerContainer messageListenerContainer(ServiceBusProcessorFactory processorFactory) {
            ServiceBusContainerProperties containerProperties = new ServiceBusContainerProperties();
            containerProperties.setEntityName(QUEUE_NAME);
            return new ServiceBusMessageListenerContainer(processorFactory, containerProperties);
        }
    
        @Bean
        public ServiceBusInboundChannelAdapter queueMessageChannelAdapter(
            @Qualifier(INPUT_CHANNEL) MessageChannel inputChannel,
            @Qualifier(SERVICE_BUS_MESSAGE_LISTENER_CONTAINER) ServiceBusMessageListenerContainer listenerContainer) {
            ServiceBusInboundChannelAdapter adapter = new ServiceBusInboundChannelAdapter(listenerContainer);
            adapter.setOutputChannel(inputChannel);
            return adapter;
        }
    
        @Bean(name = INPUT_CHANNEL)
        public MessageChannel input() {
            return new DirectChannel();
        }
    }
    
  3. Создайте класс QueueSendConfiguration Java, как показано в следующем примере. Этот класс используется для определения отправителя сообщения.

    @Configuration
    public class QueueSendConfiguration {
    
        private static final String OUTPUT_CHANNEL = "queue.output";
        private static final String QUEUE_NAME = "<your-servicebus-queue-name>";
    
        @Bean
        @ServiceActivator(inputChannel = OUTPUT_CHANNEL)
        public MessageHandler queueMessageSender(ServiceBusTemplate serviceBusTemplate) {
            serviceBusTemplate.setDefaultEntityType(ServiceBusEntityType.QUEUE);
            DefaultMessageHandler handler = new DefaultMessageHandler(QUEUE_NAME, serviceBusTemplate);
            handler.setSendCallback(new ListenableFutureCallback<Void>() {
                @Override
                public void onSuccess(Void result) {
                    System.out.println("Message was sent successfully.");
                }
    
                @Override
                public void onFailure(Throwable ex) {
                    System.out.println("There was an error sending the message.");
                }
            });
    
            return handler;
        }
    
        /**
         * Message gateway binding with {@link MessageHandler}
         * via {@link MessageChannel} has name {@value OUTPUT_CHANNEL}
         */
        @MessagingGateway(defaultRequestChannel = OUTPUT_CHANNEL)
        public interface QueueOutboundGateway {
            void send(String text);
        }
    }
    
  4. Подключите отправителя и получателя для отправки и получения сообщений с помощью Spring, как показано в следующем примере:

    @SpringBootApplication
    @EnableIntegration
    @Configuration(proxyBeanMethods = false)
    public class ServiceBusIntegrationApplication {
    
        public static void main(String[] args) {
            ConfigurableApplicationContext applicationContext = SpringApplication.run(ServiceBusIntegrationApplication.class, args);
            QueueSendConfiguration.QueueOutboundGateway outboundGateway = applicationContext.getBean(QueueSendConfiguration.QueueOutboundGateway.class);
            System.out.println("Sending a message to the queue");
            outboundGateway.send("Hello World");
        }
    
    }
    

    Совет

    Обязательно добавьте заметку @EnableIntegration , которая включает инфраструктуру Spring Integration.

  5. Запустите приложение. Вы видите журналы, аналогичные следующему примеру:

    Message was sent successfully.
    New message received: 'Hello World'
    

Использование биндера Spring Cloud Stream для Service Bus

Чтобы вызвать API служебной шины в приложении Spring Cloud Stream, используйте модуль Spring Cloud Azure Service Bus Stream Binder.

В этом руководстве показано, как использовать привязку Spring Cloud Stream для Service Bus для отправки и получения сообщений через служебную шину.

Добавьте зависимость Service Bus

Чтобы установить модуль Spring Cloud Stream Binder для Azure Service Bus, добавьте следующие зависимости в файл pom.xml:

  • Спецификация материалов Spring Cloud Azure (BOM):

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

    Примечание.

    Если вы используете Spring Boot 2.x, обязательно установите spring-cloud-azure-dependencies версию на 4.20.0. Этот счет материалов (BOM) должен быть настроен в <dependencyManagement> разделе pom.xml файла. Это гарантирует, что все зависимости Spring Cloud Azure используют одну и ту же версию. Дополнительные сведения о версии, используемой для этого BOM, см. в статье "Какая версия Spring Cloud Azure должна использоваться".

  • Артефакт интеграции Spring Cloud Сервисная шина Azure

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

Код приложения для отправки и получения сообщений

  1. Настройте пространство имен для Service Bus, как показано в следующем примере:

    spring.cloud.azure.servicebus.namespace=<service-bus-namespace-name>
    
  2. Создайте приемник сообщений.

    Чтобы использовать приложение в качестве приемника событий, настройте привязщик ввода, указав следующие сведения:

    • Объявите бин, определяющий Consumer логику обработки сообщений. Например, следующая Consumer фасоль называется consume:

      @Bean
      public Consumer<Message<String>> consume() {
          return message -> {
              System.out.printf("New message received: '%s'.%n", message.getPayload());
          };
      }
      
    • Добавьте конфигурацию, чтобы указать имя queue для использования, заменив заполнителем <service-bus-queue-name>, как показано в следующем примере:

      # name for the `Consumer` bean
      spring.cloud.function.definition=consume
      spring.cloud.stream.bindings.consume-in-0.destination=<service-bus-queue-name>
      

      Примечание.

      Чтобы использовать подписку в служебной шине, обязательно измените consume-in-0 свойства привязки, как показано в следующем примере:

      spring.cloud.stream.bindings.consume-in-0.destination=<service-bus-topic-name>
      spring.cloud.stream.bindings.consume-in-0.group=<service-bus-subscription-name>
      
  3. Создайте отправителя сообщения.

    Чтобы использовать приложение в качестве источника событий, настройте выходной привязчик, указав следующие сведения:

    • Определите bean Supplier, который указывает, откуда в вашем приложении поступают сообщения.

      @Bean
      return () -> {
              System.out.println("Sending a message.");
              return MessageBuilder.withPayload("Hello world").build();
          };
      }
      
    • Добавьте конфигурацию для указания имени для отправки queue, заменив заполнитель <your-servicebus-queue-name> в следующем примере:

      # "consume" is added from the previous step
      spring.cloud.function.definition=consume;supply
      spring.cloud.stream.bindings.supply-out-0.destination=<your-servicebus-queue-name>
      spring.cloud.stream.servicebus.bindings.supply-out-0.producer.entity-type=queue
      

      Примечание.

      Чтобы отправить в тему Service Bus, обязательно измените entity-type на topic.

  4. Запустите приложение. Вам показываются логи, аналогичные следующему примеру:

    Sending a message.
    New message received: 'Hello world'.
    

Развертывание в Azure Spring Apps

Теперь, когда у вас есть приложение Spring Boot, работающее локально, пришло время переместить его в рабочую среду. Azure Spring Apps упрощает развертывание приложений Spring Boot в Azure без каких-либо изменений кода. Эта служба управляет инфраструктурой приложений Spring, благодаря чему разработчики могут сосредоточиться на коде. Azure Spring Apps обеспечивает управление жизненным циклом за счет комплексного мониторинга и диагностики, управления конфигурацией, обнаружения служб, интеграции CI/CD, выполнения сине-зеленых развертываний и прочего. Сведения о развертывании приложения в Azure Spring Apps см. в статье "Развертывание первого приложения в Azure Spring Apps".

Следующие шаги

См. также

Дополнительные сведения о дополнительных начальных средах Spring Boot, доступных для Microsoft Azure, см. в статье "Что такое Spring Cloud Azure?"