Использование Служебная шина Azure в приложениях Spring

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

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

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

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

Необходимые компоненты

Примечание.

Чтобы предоставить учетной записи доступ к ресурсам служебная шина, в созданном пространстве имен Служебная шина Azure назначьте роли Служебная шина Azure отправителя данных и Служебная шина Azure получателю данных учетной записи Майкрософт, которую вы сейчас используете. Используя. Дополнительные сведения см. в разделе Назначение ролей Azure с помощью портала Azure.

Внимание

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

Подготовка локальной среды

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

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

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

Примечание.

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

Использование начального Служебная шина Azure Spring Cloud

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

Добавление зависимости служебная шина

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

  • Выставление счетов за материалы Spring Cloud (BOM):

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

    Примечание.

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

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

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

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

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

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

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

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

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

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

Примечание.

Пакет SDK для Java Azure для служебная шина предоставляет несколько клиентов для взаимодействия с служебная шина. Начальный элемент также предоставляет автоматическую настройку для всех служебная шина клиентов и построитель клиентов. Здесь мы используем только ServiceBusSenderClient примеры.ServiceBusProcessorClient

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

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

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

    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
    

    Совет

    Здесь мы используем очередь служебная шина в качестве примера. Чтобы использовать раздел или подписку, необходимо добавить 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!
    

Создание клиентов служебная шина программным способом

Вы можете создать эти клиентские бобы самостоятельно, но процесс является сложным. В приложениях 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> заполнитель именем узла служебная шина из портал 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. Вместо этого можно напрямую внедрить бобы и использовать свойства конфигурации, с которыми вы уже знакомы для настройки служебная шина.

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

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

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

Использование начального модуля JMS в Spring Cloud Служебная шина Azure

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


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

Добавление зависимости служебная шина

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

  • Выставление счетов за материалы Spring Cloud (BOM):

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

    Примечание.

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

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

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

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

  1. Настройте строка подключения и ценовую категорию для служебная шина, как показано в следующем примере:

    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 bean, чтобы сериализовать содержимое в формате 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> заполнитель собственным именем очереди, настроенным в служебная шина пространстве имен.

    Если вы используете раздел или подписку, измените 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> заполнитель собственным именем очереди, настроенным в служебная шина пространстве имен.

    Совет

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

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

    Sending a user message.
    Received a message from Tom.
    

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

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

Использование Spring Messaging Служебная шина Azure

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

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

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

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

Добавление зависимости служебная шина

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

  • Выставление счетов за материалы Spring Cloud (BOM):

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

    Примечание.

    Если вы используете Spring Boot 2.x, обязательно установите для нее spring-cloud-azure-dependencies значение 4.17.0. Этот счет материалов (BOM) должен быть настроен в <dependencyManagement> разделе pom.xml файла. Это гарантирует, что все зависимости Azure Spring Cloud используют одну и ту же версию. Дополнительные сведения о версии, используемой для этого 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. Настройте пространство имен и тип очереди для служебная шина, как показано в следующем примере:

    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 заметки в качестве имени раздела и добавьте subscription параметр, чтобы описать имя подписки.

  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

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

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

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

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

Добавление зависимости служебная шина

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

  • Выставление счетов за материалы Spring Cloud (BOM):

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

    Примечание.

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

  • Артефакт интеграции Spring Cloud Служебная шина Azure:

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

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

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

    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 служебная шина

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

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

Добавление зависимости служебная шина

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

  • Выставление счетов за материалы Spring Cloud (BOM):

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

    Примечание.

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

  • Артефакт интеграции Spring Cloud Служебная шина Azure:

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

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

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

    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
      

      Примечание.

      Чтобы отправить в раздел служебная шина, обязательно измените его на entity-typetopic.

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