Spring Dataflow将消息从一个Rabbit VHost移到另一个

时间:2019-05-20 14:58:09

标签: spring spring-cloud-dataflow spring-rabbitmq

TLDR:似乎无法将消息从一个RabbitMQ VHost传递到另一个RabbitMQ VHost。

我在Spring Cloud Dataflow中遇到问题,尽管为源和接收器指定了不同的RabbitMQ VHost,但它们却从未到达目标Exchange。

我的数据流流如下所示:RabbitMQ CustomProcessor | RabbitMQ水槽

RabbitMQ源从vHostA上的队列读取,并且RabbitMQ接收器应该输出到vHostB上的ExchangeBlah。

但是,没有消息最终出现在vHostB的ExchangeBlah上,并且RabbitMQ Sink日志中出现错误消息:

  

频道关闭:频道错误;协议方法:'方法(回复代码= 404,回复文本= NOT_FOUND-虚拟主机'vHostA'中没有交换'ExchangeBlah',类ID = 60,方法ID = 40)

我觉得这可能与Spring环境变量有关

  

spring.cloud.dataflow.applicationProperties.stream.spring.rabbitmq.virtual-host = vhostA

由于Dataflow使用队列作为流的不同阶段之间的通信,因此,如果我未指定此设置,则RabbitMQ源和接收器通信队列将在其各自配置中指定的VHost上创建,但是,没有通信队列为CustomProcessor创建。 因此,数据被卡在“源”通信队列中。

此外,我知道Shovels可以解决这个问题,但是感觉如果RabbitMQ接收器中提供了输出到其他VHost的选项,那么它应该可以工作。

>

总而言之,这很可能是Rabbit Stream Source / Sink应用程序的一个错误。

更新: 查看流定义(一旦部署了流),将定义两次 spring.rabbitmq.virtual-host 开关。一次使用针对接收器定义的vHostB,然后再次使用属于Spring属性的vHostA。

删除虚拟主机应用程序属性,并在处理器(包括RabbitMQ源和接收器)上显式设置spring.rabbitmq.virtual-host,主机,用户名和密码,这使其成为处理器通信队列的方式,但是RabbitMQ接收器设置为其他VHost,似乎没有任何作用。

在这种情况下,在流的各个阶段之间创建的通信队列是在源正在读取(vHostA)的同一VHost上创建的。由于我们只能将spring.rabbitmq.virtual-host设置一次提供给应用程序,因此接收器不知道查看通信队列以将数据传递到vHost B上的目标交换。

几乎就像在Source和Sink RabbitMQ上缺少开关,或者我是否缺少一个总体设置,该设置定义了通信队列应驻留的VHost,而没有覆盖RabbitMQ源和接收器上的源VHost和目标VHost。 ?

1 个答案:

答案 0 :(得分:2)

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

是Apps本身独立连接到发布/订阅RabbitMQ交易所。引导时,只要正确的“ env-vars”作为属性进入应用程序,它们就应该能够按照配置进行连接。

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

在您的情况下,您似乎想分别在源和接收者级别覆盖virtual-host,您可以在流定义中作为这些应用程序的特定属性来完成这些操作,可以按行或作为部署属性。

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