You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:55:17