【问题标题】:Spring Dataflow Move messages from one Rabbit VHost to anotherSpring Data Flow 将消息从一个 Rabbitmq VHost 移动到另一个
【发布时间】: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


    【解决方案1】:

    请注意,SCDF 不直接与 RabbitMQ 通信。 SCDF 尝试基于从流+应用程序名称派生的明确命名约定自动创建 Spring Cloud Stream“env-vars”。

    连接发布/订阅 RabbitMQ 交换的是应用程序本身。至于正确的“env-vars”作为应用程序启动时的属性,它们应该能够根据配置进行连接。

    您指出了spring.cloud.dataflow.applicationProperties.stream.spring.rabbitmq.virtual-host=vhostA 属性。如果提供,SCDF 会尝试将其作为virtual-host 传播到所有它部署到目标平台的流应用程序。

    在您的情况下,听起来您想在源和接收器级别独立覆盖virtual-host,您可以在流定义中作为这些应用程序的特定属性来完成,或者作为内联提供或作为部署属性。

    完成后,您可以通过访问应用程序的执行器端点来确认它们是否考虑在内。具体来说,/configprops 会很有用。

    【讨论】:

    • 谢谢@Sabby,对不起,也许我应该提到,我已经在 Source 和 Sink Rabbits 上指定了 vHostA 和 vHostB,这是我感到困惑的主要原因,因为我认为那会覆盖属性。仍在查看执行器输出,看看是否会产生更多信息。
    猜你喜欢
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    相关资源
    最近更新 更多