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

Testing RabbitMQ locally with Apache QPID - random port

我想为一些连接到 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.

发送 sending/receiving 消息

但问题是这一行...

"port" : "${qpid.amqp_port}",

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

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

不幸的是,这不起作用,Broker 始终在默认端口(5672,iirc)上侦听。显然这不是自动化测试的最佳选择,所以我正在寻找以下可能性之一(或更好的可能性):

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

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