如何在Quarkus(Kotlin)中连接Azure ServiceBus订阅接收消息?
Quarkus 连接 Azure Service Bus 订阅问题解决方案
方案一:Service Bus JMS + SmallRye Reactive Messaging JMS 兼容处理
你遇到的API不兼容错误,大概率是依赖版本未对齐导致的。Quarkus 对第三方依赖有严格的版本管控,手动引入service-bus-jms-connection-factory容易和 SmallRye 组件版本冲突。
正确依赖配置
使用 Quarkus BOM 管理版本,避免手动指定版本号:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>azure-spring-cloud-starter-servicebus-jms</artifactId> <!-- 无需指定版本,由 Quarkus BOM 或 Azure Spring Cloud BOM 管控 --> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-smallrye-reactive-messaging-jms</artifactId> </dependency>
合规的 ConnectionFactory 生产Bean
避免自定义Bean的API不匹配,按以下方式实现:
import com.microsoft.azure.servicebus.jms.ServiceBusJmsConnectionFactory; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.inject.Produces; import org.eclipse.microprofile.config.inject.ConfigProperty; @ApplicationScoped public class ServiceBusConnectionFactoryProducer { @ConfigProperty(name = "azure.servicebus.connection-string") String connectionString; @Produces public ServiceBusJmsConnectionFactory createConnectionFactory() { return new ServiceBusJmsConnectionFactory(connectionString); } }
消息接收配置
在application.properties中配置JMS连接器:
# JMS 连接器配置 mp.messaging.incoming.service-bus-subscription.connector=smallrye-jms # 若为主题订阅,格式为 主题名/subscriptions/订阅名 mp.messaging.incoming.service-bus-subscription.destination=your-topic-name/subscriptions/your-subscription-name mp.messaging.incoming.service-bus-subscription.destination-type=topic # 若为队列订阅,直接指定队列名 # mp.messaging.incoming.service-bus-subscription.destination=your-queue-name # mp.messaging.incoming.service-bus-subscription.destination-type=queue
然后使用@Incoming接收:
import jakarta.enterprise.context.ApplicationScoped; import org.eclipse.microprofile.reactive.messaging.Incoming; @ApplicationScoped public class ServiceBusMessageConsumer { @Incoming("service-bus-subscription") public void processMessage(String message) { // 处理消息逻辑 System.out.println("Received message: " + message); } }
方案二:Quarkus AMQP 连接器问题处理
SSL握手错误解决
javax.net.ssl.SSLHandshakeException并非简单开启trust-all就能解决,Azure Service Bus 使用的根证书可能不在Quarkus默认信任库中。可以尝试以下两种方式:
- 升级JDK版本:确保使用JDK11及以上版本,多数现代JDK已内置Azure所需的根CA证书。
- 指定自定义信任库:将Azure根证书导入自定义JKS信任库,然后在
application.properties中配置:
quarkus.ssl.trust-store=classpath:truststore.jks quarkus.ssl.trust-store-password=your-truststore-password
指定Service Bus订阅的方法
使用AMQP连接器时,需通过配置指定订阅源地址,无需修改@Incoming属性。在application.properties中配置:
# AMQP 基础连接配置 mp.messaging.incoming.amqp-subscription.connector=smallrye-amqp mp.messaging.incoming.amqp-subscription.host=sb://your-servicebus-namespace.servicebus.windows.net mp.messaging.incoming.amqp-subscription.username=$ConnectionString mp.messaging.incoming.amqp-subscription.password=your-servicebus-connection-string # 指定订阅源:主题订阅格式为 topic:主题名/subscriptions:订阅名 mp.messaging.incoming.amqp-subscription.source=topic:your-topic-name/subscriptions:your-subscription-name # 队列订阅直接指定队列名 # mp.messaging.incoming.amqp-subscription.source=queue:your-queue-name
对应的消息接收代码:
@ApplicationScoped public class AmqpMessageConsumer { @Incoming("amqp-subscription") public void processAmqpMessage(String message) { // 处理消息逻辑 System.out.println("AMQP Received message: " + message); } }
内容的提问来源于stack exchange,提问作者JoeBloggs
相关产品推荐
相关产品推荐

