如何用Qpid Proton Java连接Azure Service Bus?发送消息报错求助
解决Azure Service Bus发送消息时"No address provided for Connection"错误
看起来你遇到的问题核心是Proton客户端没能正确识别连接或目标地址——哪怕你已经修改了主机名,还是因为地址配置逻辑不对触发了这个异常。我来帮你一步步排查和解决:
1. 修正连接URL的格式
你当前用的amqps://XXX:XXX@abcd.servicebus.windows.net/queueName把凭证、命名空间和队列名混在了一起,但Qpid Proton-J这类客户端通常要求连接URL只到命名空间级别,队列地址单独指定:
- 正确的连接URL:
amqps://abcd.servicebus.windows.net - 队列地址单独设置为
queueName(部分版本可能需要写/queueName,可以两种都试试)
2. 检查代码中的地址配置逻辑
很多时候错误出在代码里没把队列地址传给发送者,而是错误地拼在了连接URL里。给你一个标准的正确代码片段参考:
// 仅包含命名空间的连接地址 String connectionUrl = "amqps://abcd.servicebus.windows.net"; // SAS凭证(从Azure门户共享访问策略中获取) String sasUsername = "XXX"; String sasPassword = "XXX"; // 目标队列的名称 String queueName = "queueName"; // 初始化连接工厂 ConnectionFactory factory = new ConnectionFactory(); factory.setHost(connectionUrl); factory.setUsername(sasUsername); factory.setPassword(sasPassword); // 创建连接、会话并发送消息 try (Connection connection = factory.createConnection(); Session session = connection.createSession(); Sender sender = session.createSender(queueName)) { connection.open(); // 构建并发送消息 Message message = Message.Factory.create(); message.setBody(new AmqpValue("测试Azure Service Bus消息")); sender.send(message); System.out.println("消息发送成功"); } catch (Exception e) { e.printStackTrace(); }
3. 验证SAS凭证与权限
- 确认你的SAS用户名(一般是
RootManageSharedAccessKey)和密钥没有拼写错误,也没有多余空格或转义问题 - 检查该SAS策略是否勾选了Send权限,没有发送权限也会间接触发地址相关的异常
4. 升级客户端版本
如果你的Qpid Proton-J版本较旧,可能对带路径的连接URL支持不完善。建议升级到最新稳定版,比如Maven依赖可以这么配置:
<dependency> <groupId>org.apache.qpid</groupId> <artifactId>qpid-proton-j</artifactId> <version>0.33.8</version> </dependency>
5. 确认队列存在
最后再检查一遍:你指定的queueName确实存在于目标Service Bus命名空间中,没有拼写错误或者大小写不一致的问题。
按照这些步骤调整后,应该能解决这个"No address provided"的错误。如果还是不行,可以把你的Send类代码片段贴出来,我帮你进一步定位问题。
内容的提问来源于stack exchange,提问作者Abhishek Kumar
相关产品推荐
相关产品推荐

