Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье показано, как использовать Служебная шина Azure в приложениях Java, созданных с помощью Spring Framework.
Azure предоставляет асинхронную платформу обмена сообщениями с именем Служебная шина Azure (служебная шина), которая основана на стандарте Расширенного протокола очереди сообщений 1.0 (AMQP 1.0). Вы можете использовать службу шины сообщений на поддерживаемых платформах Azure.
Spring Cloud Azure предоставляет различные модули для отправки и получения сообщений из очередей и тем в служебной шине, а также из подписок, используя платформы Spring.
Для разных вариантов использования можно использовать следующие модули независимо или объединить их.
Spring Cloud Azure Service Bus Starter позволяет отправлять и получать сообщения, используя клиентскую библиотеку Java SDK для Service Bus с функциями Spring Boot.
Spring Cloud Azure Service Bus JMS Starter позволяет использовать API JMS для отправки и получения сообщений с помощью очередей и тем/подписок Azure Service Bus.
Spring Messaging Azure Service Bus позволяет взаимодействовать с шиной Service Bus через API Spring Messaging.
Spring Integration для Azure Service Bus позволяет подключать каналы сообщений к со служебной шиной.
Spring Cloud Stream Binder для Service Bus позволяет использовать Service Bus в качестве промежуточного слоя для обмена сообщениями в приложениях Spring Cloud Stream.
Предварительные условия
- Подписка Azure — создайте бесплатную учетную запись.
- Пакет средств разработки Java (JDK) версии 8 или более поздней.
- Apache Maven версии 3.0 или более поздней.
- Служебная шина Azure и очередь или тематический канал с подпиской. Если у вас не настроена очередь или тема Service Bus, создайте её. Дополнительные сведения см. в статье «Использование портала Azure для создания пространства имен и очереди службы шины» или «Использование портала Azure для создания раздела и подписок на раздел службы шины».
- Если у вас нет приложения Spring Boot, создайте проект Maven с помощью Spring Initializr. Обязательно выберите Проект Maven и в разделе "Зависимости" добавьте зависимость Spring Web , а затем выберите Java версии 8 или более поздней.
Примечание.
Чтобы предоставить вашей учетной записи доступ к ресурсам шины сообщений, в вновь созданном пространстве имен 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, настройте приложение, выполнив следующие действия.
Настройте пространство имен и очередь 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
.Создайте класс
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()); }; } }
Внедрите
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
.Запустите приложение. Вы видите журналы, аналогичные следующему примеру:
Sent a message to the queue Processing message. Id: 6f405435200047069a3caf80893a80bc, Sequence #: 1. Contents: Hello, World!
Создание клиентов Service Bus программным образом
Вы можете создать эти клиентские бины самостоятельно, но процесс сложный. В приложениях Spring Boot необходимо управлять свойствами, изучать шаблон построителя и регистрировать клиент в контексте приложения Spring. В следующем примере кода показано, как это сделать:
Создайте класс
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>
собственное имя очереди, настроенное в вашем пространстве имен служебной шины.Внедрите клиентские компоненты в приложение, как показано в следующем примере:
@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(); } }
Запустите приложение. Вы видите журналы, аналогичные следующему примеру:
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>
Код приложения для отправки и получения сообщений
Настройте строку подключения и уровень цен для Service Bus, как показано в следующем примере:
spring.jms.servicebus.connection-string=<service-bus-namespace-connection-string> spring.jms.servicebus.pricing-tier=<service-bus-pricing-tier>
Создайте приемник сообщений.
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.Здесь можно создать новый
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
параметр, чтобы описать имя подписки.Подключите отправителя и получателя для отправки и получения сообщений с помощью 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
, создавая контейнер прослушивателя сообщений за кулисами.Запустите приложение. Вы видите журналы, аналогичные следующему примеру:
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>
Код приложения для отправки и получения сообщений
Настройте пространство имен и тип очереди для 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
.Создайте класс
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
, чтобы описать имя подписки.Подключите отправителя и получателя для отправки и получения сообщений с помощью 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
, создавая контейнер прослушивателя сообщений за кулисами.Запустите приложение. Вы видите журналы, аналогичные следующему примеру:
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>
Код приложения для отправки и получения сообщений
Настройте пространство имен для Service Bus, как показано в следующем примере:
spring.cloud.azure.servicebus.namespace=<your-servicebus-namespace-name>
Создайте класс
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(); } }
Создайте класс
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); } }
Подключите отправителя и получателя для отправки и получения сообщений с помощью 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.Запустите приложение. Вы видите журналы, аналогичные следующему примеру:
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>
Код приложения для отправки и получения сообщений
Настройте пространство имен для Service Bus, как показано в следующем примере:
spring.cloud.azure.servicebus.namespace=<service-bus-namespace-name>
Создайте приемник сообщений.
Чтобы использовать приложение в качестве приемника событий, настройте привязщик ввода, указав следующие сведения:
Объявите бин, определяющий
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>
Создайте отправителя сообщения.
Чтобы использовать приложение в качестве источника событий, настройте выходной привязчик, указав следующие сведения:
Определите 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
.
Запустите приложение. Вам показываются логи, аналогичные следующему примеру:
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?"