【问题标题】:Apache Camel + RabbitMq - Camel defines it's own queues and won't read from already defined queuesApache Camel + RabbitMq - Camel 定义了它自己的队列并且不会从已经定义的队列中读取
【发布时间】:2020-05-23 10:37:24
【问题描述】:

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

基本信息

我正在通过 Spring boot V2.3.0.RELEASE 运行骆驼版和骆驼兔MQ V3.3.0。 我的本地主机上运行了 2 个服务:

  • 在 localhost:5672 上是 RabbitMq v3.8.3 实例
  • 在 localhost:15672 上是一个 RabbitMq 管理实例

我通过一个简单的 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

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 路由不接收消息。

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

  • 将 passive 设置为 true,因此 RabbitMq 不会自己创建队列。

    被动队列依赖于 RabbitMQ 已经可用的队列。

  • 将 declare 设置为 false,因此 RabbitMq 不声明交换和队列本身。

    如果该选项为真,camel 声明交换和队列名称并将它们绑定在一起。如果该选项为 false,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 路由在我自己定义的队列上而不是在他自己的队列上消费?

来源:

【问题讨论】:

    标签: java spring-boot rabbitmq apache-camel


    【解决方案1】:

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

    这是我现在的 docker-compose 文件:

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

    现在一切正常。

    【讨论】:

      【解决方案2】:

      This answer 也有类似的问题,而属性的精确匹配 就是问题所在。

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

      在提到的答案中,区别在于autoDelete 标志。在 Camel 中默认为 true,当它在您的 Rabbit 队列中为 false 时,没有匹配项。

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

      也许您对预定义队列也有“属性匹配问题”。

      【讨论】:

      • 啊,很好,想知道您是否介意为此创建一个 JIRA 票证。我们应该让 camel-rabbitmq 处理这个问题,并且可能让它在组件级别管理这些队列声明,以使其在所有端点上工作。
      • 是的,当然,我会创建一个 Jira Ticket
      • 我针对这个问题创建了 CAMEL-15123。
      • @burki 我的属性组件中已经有 &autoDelete=false 了?我也声明了 false 不应该自动声明队列或交换。和被动的 true 一个选项,骆驼不应该创建它自己的队列,而是依赖于骆驼中已经存在的队列。所以我不明白为什么它仍然会自动创建队列和交换。以及为什么自动创建的交换/队列没有出现在我的管理面板中。
      • 是的,我看到autoDelete 不是您的问题。如果它是同一个问题,你将不得不找到“你的”差异。我猜自动创建的队列不会出现在 rabbit admin 中,因为名称与预定义的名称相同。如果是这样的话,那会让人特别困惑。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 2013-09-13
      相关资源
      最近更新 更多