JMeter通过amqps协议向Amazon MQ发消息报错,求解决方法
解决JMeter通过AMQPS协议发送消息到Amazon MQ(ActiveMQ引擎)的问题
问题根源
你遇到的Transport scheme not recognised: [amqps]报错,核心原因是当前使用的org.apache.activemq.jndi.ActiveMQInitialContextFactory是ActiveMQ OpenWire协议专用的JNDI工厂,它只支持tcp、ssl这类OpenWire的传输协议,无法识别AMQP协议的amqps(AMQP over SSL) scheme。
解决方案步骤
1. 替换Initial Context Factory
将JNDI初始上下文工厂改为Qpid JMS对应的实现:
org.apache.qpid.jms.jndi.JmsInitialContextFactory
2. 调整Provider URL与连接工厂配置
Qpid JMS的JNDI配置格式和ActiveMQ不同,你需要调整Provider URL或通过JNDI属性配置连接工厂:
方式1:直接在Provider URL中指定连接工厂参数(推荐)
connectionfactory.ConnectionFactory=amqps://broker-url:5671?transport.trustAll=true&user=your-username&password=your-password其中:
transport.trustAll=true:测试环境可临时跳过证书验证(生产环境建议导入Amazon MQ的CA证书到JMeter的JVM信任库)user和password:填写Amazon MQ的认证凭据
方式2:通过单独的JNDI属性文件配置
在JMeter的bin目录下创建jndi.properties文件,内容如下:java.naming.factory.initial=org.apache.qpid.jms.jndi.JmsInitialContextFactory connectionfactory.ConnectionFactory=amqps://broker-url:5671 ConnectionFactory.userName=your-username ConnectionFactory.password=your-password ConnectionFactory.transport.trustAll=true dynamicTopics.topicname=topic://topicname然后在JMeter的Provider URL中填写
file:jndi.properties
3. 清理冲突依赖
由于你同时引入了ActiveMQ Client和Qpid JMS的jar包,可能存在协议实现冲突:
- 移除ActiveMQ Client相关的jar包(如
activemq-client-5.17.6.jar),仅保留Qpid JMS及其依赖:qpid-jms-client-2.5.0.jargeronimo-jms_2.0_spec-xxx.jar- Netty系列依赖(Qpid JMS依赖的netty-all、netty-handler等)
slf4j-api-xxx.jar(日志依赖)
4. 验证配置
调整JMeter的JMS Publisher Sampler配置:
- Initial Context Factory:
org.apache.qpid.jms.jndi.JmsInitialContextFactory - Provider URL:按方式1或方式2填写
- ConnectionFactory:
ConnectionFactory - Destination:
topicname(如果用jndi.properties配置了dynamicTopics,直接填名称即可) - 取消勾选
Use Authorization(因为凭据已在连接URL或JNDI属性中配置,避免重复认证)
关键说明
- AMQPS是AMQP协议的SSL版本,必须使用Qpid JMS客户端实现,不能用ActiveMQ的OpenWire客户端
- 生产环境不要用
transport.trustAll=true,需将Amazon MQ的CA证书导入到JMeter使用的JVM信任库(路径通常是JRE/lib/security/cacerts,使用keytool命令导入)
内容的提问来源于stack exchange,提问作者shivan
相关产品推荐
相关产品推荐

