【发布时间】: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