Как настроить приложение Java Spring Boot для отправки сообщения в служебную шину Azure

Я задаю этот вопрос здесь, чтобы получить помощь от Microsoft или сообщества.

Я хочу отправлять сообщения в тему с помощью приложения Spring Boot.

Лазурная страница - это служебный автобус

Свойства моего приложения

spring.cloud.azure.servicebus.namespace=<<some name>> 
spring.cloud.azure.servicebus.entity-name=<<some topic>> 

spring.cloud.azure.servicebus.processor.subscription-name=<<somesub>> 

spring.cloud.azure.servicebus.entity-type=topic

Ошибка:

Вызвано: java.lang.IllegalArgumentException: подписка не может быть нулевой.

В моем коде есть управление зависимостями, Spring-cloud-azure-starter-servicebus.

Класс конфигурации, упомянутый на страницах — ServiceBusProcessorClientConfiguration.

и класс начальной загрузки — ServiceBusQueueApplication

(Я предпочитаю иметь отправителя и получателя в двух разных приложениях. Не похоже на ПИНГ-ПОНГ в одной и той же программе. Возможно, я хочу просмотреть/поглотить сообщение в приложении логики)

что мне не хватает? Как отправить сообщение со свойствами (см. прикреплённое)

Обновлено:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'serviceBusReceiverClientBuilder' defined in class path resource [com/azure/spring/cloud/autoconfigure/implementation/servicebus/AzureServiceBusConsumerClientConfiguration$NoneSessionConsumerClientConfiguration.class]: Failed to instantiate [com.azure.messaging.servicebus.ServiceBusClientBuilder$ServiceBusReceiverClientBuilder]: Factory method 'serviceBusReceiverClientBuilder' threw exception with message: Subscription cannot be null.
    
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.azure.messaging.servicebus.ServiceBusClientBuilder$ServiceBusReceiverClientBuilder]: Factory method 'serviceBusReceiverClientBuilder' threw exception with message: Subscription cannot be null.
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:177) ~[spring-beans-6.1.6.jar:6.1.6]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:644) ~[spring-beans-6.1.6.jar:6.1.6]
    ... 18 common frames omitted
Caused by: java.lang.IllegalArgumentException: Subscription cannot be null.
    at org.springframework.util.Assert.notNull(Assert.java:172) ~[spring-core-6.1.6.jar:6.1.6]
    at com.azure.spring.cloud.service.implementation.servicebus.factory.ServiceBusReceiverClientBuilderFactory.configureService(ServiceBusReceiverClientBuilderFactory.java:54) ~[spring-cloud-azure-service-5.11.0.jar:5.11.0]
    at com.azure.spring.cloud.service.implementation.servicebus.factory.ServiceBusReceiverClientBuilderFactory.configureService(ServiceBusReceiverClientBuilderFactory.java:15) ~[spring-cloud-azure-service-5.11.0.jar:5.11.0]
    at com.azure.spring.cloud.core.implementation.factory.AbstractAzureServiceClientBuilderFactory.build(AbstractAzureServiceClientBuilderFactory.java:128) ~[spring-cloud-azure-core-5.11.0.jar:5.11.0]
    at com.azure.spring.cloud.autoconfigure.implementation.servicebus.AzureServiceBusConsumerClientConfiguration$NoneSessionConsumerClientConfiguration.serviceBusReceiverClientBuilder(AzureServiceBusConsumerClientConfiguration.java:70) ~[spring-cloud-azure-autoconfigure-5.11.0.jar:5.11.0]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:140) ~[spring-beans-6.1.6.jar:6.1.6]
    ... 19 common frames omitted

ПОМ:

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>azureservicebus</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>azureservicebus</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>17</java.version>
        <spring-cloud-azure.version>5.11.0</spring-cloud-azure.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.azure.spring</groupId>
            <artifactId>spring-cloud-azure-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.azure.spring</groupId>
            <artifactId>spring-cloud-azure-starter-servicebus</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.azure.spring</groupId>
                <artifactId>spring-cloud-azure-dependencies</artifactId>
                <version>${spring-cloud-azure.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Можете ли вы поделиться полной трассировкой стека и pom, пожалуйста?

ozkanpakdil 11.05.2024 10:22

@Kris Swat Я попробовал пример кода проекта загрузки Spring для отправки сообщений в Azure Service Bus через Postman.

Dasari Kamali 11.05.2024 13:50

@DasariKamali, какой код ты использовал? весенний ботинок? Также убедитесь, что вы использовали фильтры, чтобы гарантировать, что сообщение будет отправлено конкретному подписчику на основе сообщения.

Kris Swat 11.05.2024 16:26

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

Dasari Kamali 11.05.2024 16:30

@DasariKamali, ты знаешь, что не так с приведенным выше кодом?

Kris Swat 11.05.2024 16:31

@KrisSwat Вы не указали свой код в вопросе. Если возможно, можете ли вы поделиться этим, чтобы я мог проверить?

Dasari Kamali 11.05.2024 16:34

@KrisSwat Сообщение об ошибке указывает на проблему с созданием bean-компонента ServiceBusReceiverClientBuilder из-за нулевого имени подписки. Эта ошибка, вероятно, возникает во время инициализации клиента-приемника служебной шины Azure.

Dasari Kamali 11.05.2024 16:49

@KrisSwat Убедитесь, что для свойства servicebus.subscription правильно задано имя вашей подписки на служебную шину.

Dasari Kamali 11.05.2024 16:50

@DasariKamali конфигурация, которую я использовал, находится в вопросе. Если можно, дайте развернутый ответ. Вы используете пример кода или собственный код, которым не можете поделиться?

Kris Swat 11.05.2024 17:05

Давайте продолжим обсуждение в чате.

Dasari Kamali 11.05.2024 17:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
10
313
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я попробовал приведенный ниже пример кода Spring Boot для отправки сообщений в тему служебной шины Azure.

Код:

Сервисбусконфиг.java:

import com.azure.messaging.servicebus.ServiceBusClientBuilder;
import com.azure.messaging.servicebus.ServiceBusProcessorClient;
import com.azure.messaging.servicebus.ServiceBusSenderClient;
import com.azure.messaging.servicebus.models.ServiceBusReceiveMode;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ServiceBusConfig {

    @Value("${servicebus.connectionString}")
    private String connectionString;

    @Value("${servicebus.topic}")
    private String topic;

    @Value("${servicebus.subscription}")
    private String subscription;

    public ServiceBusProcessorClient serviceBusProcessorClient() {
        return new ServiceBusClientBuilder()
                .connectionString(connectionString)
                .processor()
                .topicName(topic)
                .subscriptionName(subscription)
                .receiveMode(ServiceBusReceiveMode.PEEK_LOCK)
                .processMessage(context -> {
                    System.out.printf("Received message from %s, %s: %s%n", topic, subscription, context.getMessage().getBody().toString());
                    context.complete();
                })
                .processError(context -> {
                    System.err.printf("Error occurred: %s%n", context.getException());
                })
                .buildProcessorClient();
    }

    public ServiceBusSenderClient serviceBusSenderClient() {
        return new ServiceBusClientBuilder()
                .connectionString(connectionString)
                .sender()
                .topicName(topic)
                .buildClient();
    }
}

Сервисбусконтроллер.java:

import com.azure.messaging.servicebus.ServiceBusMessage;
import com.azure.messaging.servicebus.ServiceBusProcessorClient;
import com.azure.messaging.servicebus.ServiceBusSenderClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ServiceBusController {

    private final ServiceBusProcessorClient serviceBusProcessorClient;
    private final ServiceBusSenderClient serviceBusSenderClient;

    @Autowired
    public ServiceBusController(ServiceBusConfig serviceBusConfig) {
        this.serviceBusProcessorClient = serviceBusConfig.serviceBusProcessorClient();
        this.serviceBusSenderClient = serviceBusConfig.serviceBusSenderClient();
    }

    @PostMapping("/sendMessage")
    public String sendMessage(@RequestBody String message) {
        serviceBusSenderClient.sendMessage(new ServiceBusMessage(message));
        return "Message sent to Service Bus topic: " + message;
    }
}

пом.xml:

<dependencies>
     <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
     </dependency>
     <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>5.12.0</version>
          <type>pom</type>
          <scope>import</scope>
          </dependency>
     <dependency>
          <groupId>com.azure</groupId>
          <artifactId>azure-messaging-servicebus</artifactId>
          <version>7.16.0</version>
     </dependency>
        <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
     </dependency>
</dependencies>

application.properties:

servicebus.connectionString=<connec_string>
servicebus.topic=<topic_name>
servicebus.subscription=<subscription_name>

Локальный выход:

Вывод почтальона:

Я отправил сообщение в служебную шину Azure с помощью Postman следующим образом:

http://localhost:8080/sendMessage
{
"message": "Hi Kamali.Welcome!"
}

Лазурный портал:

Сообщение было успешно отправлено в служебную шину Azure, как показано ниже.

Я не использовал это, потому что Microsoft упомянула это утверждение: «В следующем списке показаны причины, по которым этот код не является гибким и изящным:» Рекомендация по использованию «К счастью, в Spring Cloud Azure нет необходимости создавать клиентские компоненты самостоятельно. Вместо этого вы можете напрямую внедрить bean-компоненты и использовать уже знакомые свойства конфигурации для настройки служебной шины».

Kris Swat 12.05.2024 01:36

@KrisSwat Хорошо, попробую другой код и сообщу.

Dasari Kamali 12.05.2024 04:37

@KrisSwat Обновлен код без Bean и теперь можно отправлять сообщения в тему Azure Service BU.

Dasari Kamali 12.05.2024 10:24
Ответ принят как подходящий

Microsoft предоставила ответ и обновила документацию

Добавьте это свойство, и тема служебной шины заработает.

spring.cloud.azure.servicebus.consumer.subscription-name=<same as processor subscription>

а насчет фильтровать сообщения, отправлять данные со свойствами приложения и правило работает

message.getApplicationProperties().put("status", data.getStatus());
senderClient.sendMessage(message);

Другие вопросы по теме

Средство подписи для доверенной учетной записи службы Azure. Информация об ошибке: «Ошибка: SignerSign() не удалось». (-2147467259/0x80004005)
Как выполнять поиск с пробелами с помощью фильтра поиска Azure AI с синтаксисом Lucene
Я не могу вызвать API анализа документов Azure, используя последнюю версию API «2024-02-29-preview»
GitLab развертывает приложение-контейнер в службе приложений Azure
Невозможно создать и использовать токен для использования ACS для пользователя команды: «CallAgent должен быть создан только с токеном ACS»
Проблема с пропускной способностью сети службы приложений Azure (очень медленная загрузка)
Пересылаемые сообщения Azure IoT Edge между модулями не содержат свойств (целевой Node-RED) (РЕШЕНО)
Клонирование/копирование репозитория из AzureDevOps в Databricks
Проблема приложения логики Azure с управляемым удостоверением, назначенным пользователем
Клиент с идентификатором объекта не имеет полномочий на выполнение действия «Microsoft.DataFactory/factories/triggers/write» в области действия

Похожие вопросы