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:
- 在 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 不会自己创建队列。
Passive queues depend on the queue already to be available at RabbitMQ.
- 将 declare 设置为 false,因此 RabbitMq 不会自行声明交换和队列。
If the option is true, camel declare the exchange and queue name and bind them together. If the option is false, camel won’t declare the exchange and queue name on the server.
- 写入队列有效,但这并没有通过管理控制台显示在自定义 "in-queue" 中:
代码示例:
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"
现在一切正常。
我有一个问题,我想让 Camel-RabbitMq 从我自己定义的队列中消费。 通过 Camel 路由写入和读取队列是可行的,但只能通过骆驼自己定义的队列。我似乎无法将 Camel 指向我在 RabbitMQ 上定义的队列。
基本信息
我是 运行ning camel version & camel-rabbitmq V3.3.0 via Spring boot V2.3.0.RELEASE。 我的本地主机上有 2 个服务 运行ning:
- 在 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 不会自己创建队列。
Passive queues depend on the queue already to be available at RabbitMQ.
- 将 declare 设置为 false,因此 RabbitMq 不会自行声明交换和队列。
If the option is true, camel declare the exchange and queue name and bind them together. If the option is false, camel won’t declare the exchange and queue name on the server.
- 写入队列有效,但这并没有通过管理控制台显示在自定义 "in-queue" 中:
代码示例:
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"
现在一切正常。