使用 Apache QPID 在本地测试 RabbitMQ - 随机端口

Posted

技术标签:

【中文标题】使用 Apache QPID 在本地测试 RabbitMQ - 随机端口【英文标题】:Testing RabbitMQ locally with Apache QPID - random port 【发布时间】:2018-10-02 11:39:09 【问题描述】:

我想为连接到 RabbitMQ 的一些组件设置一个小本地测试。为此,一种解决方案似乎是 QPID In-Memory Broker,实际上在关注these instructions 时效果很好(仅使用当前版本的 7.0.3 而不是 7.0.0)...

对于 Rabbit MQ,我删除了 "AMQP_1_0" 协议,只添加了 qpid-broker-plugins-amqp-0-8-protocol 依赖项。我还用PLAIN 替换了Authenticationprovider。这足以让我的RabbitMQ 组件工作并通过Broker 发送/接收消息。

但问题是这条线......

"port" : "$qpid.amqp_port",

据我了解,这应该允许我通过在调用systemLauncher.startup 时设置此属性来定义代理正在侦听的端口。

attributes.put("qpid.amqp_port", 12345);

不幸的是,这不起作用,Broker 总是在默认端口(5672,iirc)上侦听。显然这对于​​自动化测试来说不是最优的,所以我正在寻找以下一种可能性(或更好的一种):

    在属性中放一个随机端口(我自己可以找到一个开放的端口,没问题)或者... 告诉 QPID 使用随机(开放)端口 - 但我还需要知道实际使用的是哪个端口,因为 SystemLauncher 似乎没有提供任何查询方式。

【问题讨论】:

嗨弗洛里安!看来我的情况非常相似。我在这里描述了它***.com/questions/51345844/…。我怀疑我错误地使用了 qpid bloker。你能看看我的问题吗? 【参考方案1】:

Apache Qpid Broker-J 的SystemLauncher 支持SystemLauncherListeners,它会在启动序列的各个点得到通知。如果将 Broker 配置为绑定到端口 0,则会在运行时分配动态分配的端口。然后,您可以使用#afterStartup() 实现来确定绑定了哪个端口。以PortExtractingLauncherListener(测试工具代码)为例进行学习。

在 Broker-J 的模型中,object's attributes and context variables 之间存在区别。如果你想为qpid.amqp_port 提供一个替换,你可以通过提供一个上下文变量来做到这一点。你可以这样编程:

attributes.put("context", Collections.singletonMap("qpid.amqp_port", 0))

或者,因为上下文变量是 Java 系统属性中的默认变量,就像 JVM 命令行中的这样 -Dqpid.amqp_port=0

【讨论】:

以上是关于使用 Apache QPID 在本地测试 RabbitMQ - 随机端口的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring、ActiveMQ 和 Qpid 进行集成测试

Apache Qpid Python 1.35.0 发布

Apache QPID 队列大小和计数

Qpid第五课 消息总线使用经验

如何使用 qpid-jms-client 创建 RabbitMQ 持久队列?

生产者(设备)和消息服务器(Apache Qpid 或 RabbitMQ)之间的负载平衡