我有一个问题,我想让Camel-RabbitMq从我自己定义的队列中使用。通过骆驼路线对队列进行写入和读取,但只能通过骆驼自己定义的队列进行。我似乎无法将骆驼指向我在RabbitMQ上定义的队列。
我正在通过Spring Boot V2.3.0.RELEASE运行骆驼版本和camel-rabbitmq V3.3.0。我在本地主机上运行2个服务:
我通过一个简单的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时,什么都没有发生。骆驼路线未收到该消息。
我尝试了以下可能的解决方案:
被动队列取决于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路由定义了它在其他地方的队列。如何定义骆驼路线是在我自己定义的队列上消费,而不是在他自己的队列上消费?
来源:
This answer有类似的问题,而属性的完全匹配是问题。
因此,如果您的连接字符串与预定义队列的属性不完全匹配,则骆驼“找不到”它,而是创建一个自己的。 差异可以隐藏在骆驼使用者的默认值中。
在提到的答案中,不同之处是autoDelete
标志。在Camel中,默认情况下它似乎是true
,而在Rabbit队列中它是false
时,则没有匹配项。
他们必须将&autoDelete=false
添加到连接字符串以匹配预定义的队列。
也许您在预定义的队列中也遇到“属性匹配问题”。