Я задаю этот вопрос здесь, чтобы получить помощь от 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>
@Kris Swat Я попробовал пример кода проекта загрузки Spring для отправки сообщений в Azure Service Bus через Postman.
@DasariKamali, какой код ты использовал? весенний ботинок? Также убедитесь, что вы использовали фильтры, чтобы гарантировать, что сообщение будет отправлено конкретному подписчику на основе сообщения.
@KrisSwat Да, я использовал Spring загрузку, чтобы отправить сообщение в тему служебной шины Azure с подпиской.
@DasariKamali, ты знаешь, что не так с приведенным выше кодом?
@KrisSwat Вы не указали свой код в вопросе. Если возможно, можете ли вы поделиться этим, чтобы я мог проверить?
@KrisSwat Сообщение об ошибке указывает на проблему с созданием bean-компонента ServiceBusReceiverClientBuilder из-за нулевого имени подписки. Эта ошибка, вероятно, возникает во время инициализации клиента-приемника служебной шины Azure.
@KrisSwat Убедитесь, что для свойства servicebus.subscription правильно задано имя вашей подписки на служебную шину.
@DasariKamali конфигурация, которую я использовал, находится в вопросе. Если можно, дайте развернутый ответ. Вы используете пример кода или собственный код, которым не можете поделиться?
Давайте продолжим обсуждение в чате.




Я попробовал приведенный ниже пример кода 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-компоненты и использовать уже знакомые свойства конфигурации для настройки служебной шины».
@KrisSwat Хорошо, попробую другой код и сообщу.
@KrisSwat Обновлен код без Bean и теперь можно отправлять сообщения в тему Azure Service BU.
Microsoft предоставила ответ и обновила документацию
Добавьте это свойство, и тема служебной шины заработает.
spring.cloud.azure.servicebus.consumer.subscription-name=<same as processor subscription>
а насчет фильтровать сообщения, отправлять данные со свойствами приложения и правило работает
message.getApplicationProperties().put("status", data.getStatus());
senderClient.sendMessage(message);
Можете ли вы поделиться полной трассировкой стека и pom, пожалуйста?