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

Flo*_*etz 2 java testing rabbitmq qpid

我想为连接到RabbitMQ的某些组件设置一些本地测试。为此,一种解决方案似乎是QPID内存代理,并且在遵循这些说明时(仅使用当前版本的7.0.3而不是7.0.0)实际上非常有效。

对于Rabbit MQ,我删除了"AMQP_1_0"协议,仅添加了qpid- broker-plugins-amqp-0-8-protocoldependency。我也用替换AuthenticationproviderPLAIN。这足以使我的RabbitMQ组件正常工作并通过该组件发送/接收消息Broker

但是问题是这条线...

"port" : "${qpid.amqp_port}",
Run Code Online (Sandbox Code Playgroud)

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

attributes.put("qpid.amqp_port", 12345);
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用,并且代理总是在默认端口(5672,iirc)上侦听。显然,这对于自动化测试不是最佳选择,因此我正在寻找以下一种可能性(或更好的一种):

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

k-w*_*all 5

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

在Broker-J的模型中,对象的属性和上下文变量之间存在区别。如果要替换,qpid.amqp_port请提供一个上下文变量。您可以这样以编程方式像这样:

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

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