Spring 数据流将消息从一个 Rabbit VHost 移动到另一个
Spring Dataflow Move messages from one Rabbit VHost to another
TLDR:似乎无法将消息从一个 RabbitMQ VHost 传递到另一个 RabbitMQ VHost。
我在使用 Spring Cloud Dataflow 时遇到问题,尽管为源和接收器指定了不同的 RabbitMQ VHost,但它们似乎永远无法到达目标 Exchange。
我的数据流看起来像这样:RabbitMQ 源 |自定义处理器 | RabbitMQ 接收器
RabbitMQ 源从 vHostA 和 RabbitMQ 接收器上的队列读取应该输出到 vHostB 上的 ExchangeBlah。
但是,vHostB 上的 ExchangeBlah 上没有消息结束,我在 RabbitMQ 接收器日志中收到错误消息:
Channel shutdown: channel error; protocol method: 'method(reply-code=404, reply-text=NOT_FOUND - no exchange 'ExchangeBlah' in vhost 'vHostA', class-id=60, method-id=40)
我感觉这可能与 Spring 环境变量有关
spring.cloud.dataflow.applicationProperties.stream.spring.rabbitmq.virtual-host=vhostA
由于 Dataflow 使用队列作为 Stream 不同阶段之间的通信,如果我没有指定此设置,那么 RabbitMQ 源和接收器通信队列将在各自配置中指定的 VHost 上创建,但是,没有为 CustomProcessor 创建通信队列。
因此,数据会卡在源通信队列中。
此外,我知道 Shovels 可以解决这个问题,但感觉如果在 RabbitMQ 接收器中可以选择输出到不同的 VHost,那么它 应该 工作。
综上所述,这很可能是 Rabbit Stream Source/Sink 应用程序的错误。
更新:
查看流定义(一旦部署了流), spring.rabbitmq.virtual-host 开关被定义了两次。一次是针对接收器定义的 vHostB,然后是 Spring 属性.
的 vHostA
删除虚拟主机应用程序 属性 并在处理器上显式设置 spring.rabbitmq.virtual-主机、主机、用户名和密码(包括 RabbitMQ 源和接收器),然后它进入处理器通信队列,但由于 RabbitMQ 接收器设置为不同的 VHost,它似乎没有进一步。
在这种情况下,在流的各个阶段之间创建的通信队列是在源正在读取的同一 VHost (vHostA) 上创建的。由于我们只能将 spring.rabbitmq.virtual-host 设置提供给应用程序一次,因此接收器不知道查看通信队列以将该数据传递到它在 vHost B 上的目标交换。
这几乎就像源和接收器 RabbitMQ 上缺少开关,或者我是否缺少一个整体设置,该设置定义了通信队列应驻留的 VHost,而没有覆盖 RabbitMQ 源上的源和目标 VHost和下沉?
请注意,SCDF 不直接与 RabbitMQ 通信。 SCDF 尝试根据从流 + 应用程序名称派生的 well-defined 命名约定自动创建 Spring Cloud Stream "env-vars"。
是应用程序本身独立连接到 publish/subscribe 到 RabbitMQ 交换。至于正确的 "env-vars" 在 bootstrap 时作为应用程序的属性登陆,它们应该能够根据配置进行连接。
您指出 spring.cloud.dataflow.applicationProperties.stream.spring.rabbitmq.virtual-host=vhostA
属性。如果提供,SCDF 会尝试将其作为 virtual-host
传播到 所有 它部署到目标平台的流应用程序。
在您的情况下,听起来您想在源和接收器级别独立地覆盖 virtual-host
,您可以将其作为流定义中这些应用程序的特定属性来完成,或者提供作为 in-line 或作为部署属性。
当你这样做时,你可以通过访问应用程序的执行器端点来确认它们是否被考虑在内。具体来说,/configprops
会很有用。
TLDR:似乎无法将消息从一个 RabbitMQ VHost 传递到另一个 RabbitMQ VHost。
我在使用 Spring Cloud Dataflow 时遇到问题,尽管为源和接收器指定了不同的 RabbitMQ VHost,但它们似乎永远无法到达目标 Exchange。
我的数据流看起来像这样:RabbitMQ 源 |自定义处理器 | RabbitMQ 接收器
RabbitMQ 源从 vHostA 和 RabbitMQ 接收器上的队列读取应该输出到 vHostB 上的 ExchangeBlah。
但是,vHostB 上的 ExchangeBlah 上没有消息结束,我在 RabbitMQ 接收器日志中收到错误消息:
Channel shutdown: channel error; protocol method: 'method(reply-code=404, reply-text=NOT_FOUND - no exchange 'ExchangeBlah' in vhost 'vHostA', class-id=60, method-id=40)
我感觉这可能与 Spring 环境变量有关
spring.cloud.dataflow.applicationProperties.stream.spring.rabbitmq.virtual-host=vhostA
由于 Dataflow 使用队列作为 Stream 不同阶段之间的通信,如果我没有指定此设置,那么 RabbitMQ 源和接收器通信队列将在各自配置中指定的 VHost 上创建,但是,没有为 CustomProcessor 创建通信队列。 因此,数据会卡在源通信队列中。
此外,我知道 Shovels 可以解决这个问题,但感觉如果在 RabbitMQ 接收器中可以选择输出到不同的 VHost,那么它 应该 工作。
综上所述,这很可能是 Rabbit Stream Source/Sink 应用程序的错误。
更新: 查看流定义(一旦部署了流), spring.rabbitmq.virtual-host 开关被定义了两次。一次是针对接收器定义的 vHostB,然后是 Spring 属性.
的 vHostA删除虚拟主机应用程序 属性 并在处理器上显式设置 spring.rabbitmq.virtual-主机、主机、用户名和密码(包括 RabbitMQ 源和接收器),然后它进入处理器通信队列,但由于 RabbitMQ 接收器设置为不同的 VHost,它似乎没有进一步。
在这种情况下,在流的各个阶段之间创建的通信队列是在源正在读取的同一 VHost (vHostA) 上创建的。由于我们只能将 spring.rabbitmq.virtual-host 设置提供给应用程序一次,因此接收器不知道查看通信队列以将该数据传递到它在 vHost B 上的目标交换。
这几乎就像源和接收器 RabbitMQ 上缺少开关,或者我是否缺少一个整体设置,该设置定义了通信队列应驻留的 VHost,而没有覆盖 RabbitMQ 源上的源和目标 VHost和下沉?
请注意,SCDF 不直接与 RabbitMQ 通信。 SCDF 尝试根据从流 + 应用程序名称派生的 well-defined 命名约定自动创建 Spring Cloud Stream "env-vars"。
是应用程序本身独立连接到 publish/subscribe 到 RabbitMQ 交换。至于正确的 "env-vars" 在 bootstrap 时作为应用程序的属性登陆,它们应该能够根据配置进行连接。
您指出 spring.cloud.dataflow.applicationProperties.stream.spring.rabbitmq.virtual-host=vhostA
属性。如果提供,SCDF 会尝试将其作为 virtual-host
传播到 所有 它部署到目标平台的流应用程序。
在您的情况下,听起来您想在源和接收器级别独立地覆盖 virtual-host
,您可以将其作为流定义中这些应用程序的特定属性来完成,或者提供作为 in-line 或作为部署属性。
当你这样做时,你可以通过访问应用程序的执行器端点来确认它们是否被考虑在内。具体来说,/configprops
会很有用。