【发布时间】:2019-10-06 23:26:46
【问题描述】:
TLDR:似乎无法将消息从一个 RabbitMQ VHost 传递到另一个 RabbitMQ VHost。
我在使用 Spring Cloud Dataflow 时遇到问题,尽管为源和接收器指定了不同的 RabbitMQ VHost,但它们似乎永远无法到达目标 Exchange。
我的数据流看起来像这样:RabbitMQ Source |定制处理器 | RabbitMQ 接收器
RabbitMQ Source 从 vHostA 上的队列读取数据,RabbitMQ Sink应该输出到 vHostB 上的 ExchangeBlah。
但是,vHostB 上的 ExchangeBlah 上没有消息结束,我在 RabbitMQ Sink 日志中收到错误消息:
频道关闭:频道错误;协议方法:'method(reply-code=404,reply-text=NOT_FOUND - 在 vhost 'vHostA' 中没有交换 'ExchangeBlah',class-id=60,method-id=40)
我感觉这可能和Spring环境变量有关
spring.cloud.dataflow.applicationProperties.stream.spring.rabbitmq.virtual-host=vhostA
由于 Dataflow 使用队列作为 Stream 不同阶段之间的通信,如果我不指定此设置,那么 RabbitMQ 源和接收器通信队列将在各自配置中指定的 VHost 上创建,但是,没有通信队列是为 CustomProcessor 创建的。 因此,数据会卡在 Source 通信队列中。
另外,我知道 Shovels 可以解决这个问题,但感觉如果在 RabbitMQ 接收器中可以选择输出到不同的 VHost,那么它应该工作。 p>
总而言之,这很可能是 Rabbit Stream Source/Sink 应用程序的一个错误。
更新: 查看流定义(一旦部署了流),spring.rabbitmq.virtual-host 开关被定义了两次。一次使用针对接收器定义的 vHostB,然后使用作为 Spring 属性的 vHostA。
删除虚拟主机应用程序属性并在处理器上显式设置 spring.rabbitmq.virtual-host、主机、用户名和密码(包括 RabbitMQ 源和接收器),它可以进入处理器通信队列,但作为RabbitMQ 接收器设置为不同的 VHost,它似乎没有得到任何进一步的。
在这种情况下,在流的各个阶段之间创建的通信队列是在源从 (vHostA) 读取的同一 VHost 上创建的。由于我们只能将 spring.rabbitmq.virtual-host 设置给应用程序一次,因此接收器不知道查看通信队列以将该数据传递到它在 vHost B 上的目标交换。
好像源和接收器 RabbitMQ 上缺少开关,或者我是否缺少定义通信队列应驻留的 VHost 的整体设置,而不覆盖 RabbitMQ 源和接收器上的源和目标 VHost ?
【问题讨论】:
标签: spring spring-cloud-dataflow spring-rabbit