Apache Camel + RabbitMq-Camel定义了自己的队列,不会从已定义的队列中读取

问题描述 投票:2回答:1

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

基本信息

我正在通过Spring Boot V2.3.0.RELEASE运行骆驼版本和camel-rabbitmq 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时,什么都没有发生。骆驼路线未收到该消息。

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

  • 将被动设置为true,因此RabbitMq不会自行创建队列。

    被动队列取决于RabbitMQ上已经可用的队列。

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

    如果该选项为true,则骆驼声明交换名称和队列名称并将它们绑定在一起。如果该选项为false,则骆驼不会在服务器上声明交换名称和队列名称。

  • 写入队列有效,但这未通过管理控制台显示在自定义的“队列中”:

代码示例:

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路由定义了它在其他地方的队列。如何定义骆驼路线是在我自己定义的队列上消费,而不是在他自己的队列上消费?

来源:

java spring-boot rabbitmq apache-camel
1个回答
1
投票

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

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

在提到的答案中,不同之处是autoDelete标志。在Camel中,默认情况下它似乎是true,而在Rabbit队列中它是false时,则没有匹配项。

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

也许您在预定义的队列中也遇到“属性匹配问题”。

© www.soinside.com 2019 - 2024. All rights reserved.