使用 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)上侦听。显然这不是自动化测试的最佳选择,所以我正在寻找以下可能性之一(或更好的可能性):
- 在属性中放置一个随机端口(我可以自己找到一个开放端口,没问题)或者...
- 告诉 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
我想为一些连接到 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
似乎没有提供任何查询方式。
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