Apache Camel + RabbitMq - Camel 定义它自己的队列并且不会从已经定义的队列中读取

Apache Camel + RabbitMq - Camel defines it's own queues and won't read from already defined queues

我有一个问题,我想让 Camel-RabbitMq 从我自己定义的队列中消费。 通过 Camel 路由写入和读取队列是可行的,但只能通过骆驼自己定义的队列。我似乎无法将 Camel 指向我在 RabbitMQ 上定义的队列。

基本信息

我是 运行ning camel version & camel-rabbitmq V3.3.0 via Spring boot V2.3.0.RELEASE。 我的本地主机上有 2 个服务 运行ning:

我 运行 这些实例通过一个简单的 docker-compose 文件:

version: '3'
services:
  rabbitmq:
    image: "rabbitmq:3.8.3"
    ports:
      - "5672:5672"
  rabbitmq-management:
    image: "rabbitmq:3-management"
    ports:
      - "15672:15672"

在那里我通过管理面板创建了 1 个交换器和 1 个队列:

Main_exchange和in_queue通过路由键"in_queue_routing_key"路由键相互绑定。

问题

现在,当我尝试通过骆驼路线连接以读取此 in_queue 时:

from("rabbitmq:main_exchange?addresses=localhost:5672" +
            "&passive=true"+
            "&autoDelete=false" +
            "&declare=false" +
            "&queue=in_queue" +
            "&routingKey=in_queue_routing_key")
    .log("received from queue")
.to("file:done");

当我通过主交换器向 in_queue 发布消息时,没有任何反应。 Camel路由不接收消息

我尝试了以下可能的解决方案:

代码示例:

from("file:test")
    .log("add to route")
.to("rabbitmq:main_exchange?addresses=localhost:5672" +
            "&passive=true"+
            "&autoDelete=false" +
            "&declare=false" +
            "&queue=in_queue" +
            "&routingKey=in_queue_routing_key");

但是在重新启动消费者路由(此代码示例上方的那个)后,消费者路由确实恢复了。

所以看起来 Camel-RabbitMq 路由在别处定义了它的队列。我如何定义 Camel 路由消耗我自己定义的队列而不是他自己的?

来源:

This answer 有类似的问题, 属性完全匹配 是问题所在。

因此,如果您的 连接字符串与预定义队列 的属性不完全匹配,Camel "does not find" 它会创建一个自己的字符串。 差异可以隐藏在 Camel 消费者的默认值中

在提到的答案中,不同之处在于 autoDelete 标志。它似乎在 Camel 中默认为 true,而当它在你的 Rabbit 队列中为 false 时,没有匹配项。

他们必须将 &autoDelete=false 添加到连接字符串以匹配预定义的队列。

也许您也有 "property matching problem" 预定义队列。

看来我发现了错误,Rabbitmq 有一个管理 + 实例映像,而不是一个独立的管理映像。这导致 运行 2 个 RabbitMQ 实例,一个是我正在轮询和查看的,第二个是我正在执行操作的地方,导致我没有找到任何东西,但应用程序仍在运行。

这是我的 docker-compose 文件:

version: '3'
services:
  rabbitmq-with-management:
    image: "rabbitmq:3-management"
    ports:
      - "5672:5672"
      - "15672:15672"

现在一切正常。