2017-10-15 859 views
0

我有许多可以执行某些操作的机器。要发起一个动作,我想发送一条消息到一个由机器ID命名的队列,例如“12345”。使用AMQP/RabbitMQ将消息发送到独占队列

为了避免其他人使用这些消息,我认为队列应该是排他性的。

但是从我的控制器来看,如果队列在使用它的机器上声明为独占队列,我就无法声明这个队列。但是,我可以通过指定其名称来发送队列,但没有断言,但我认为这是不好的做法?

该机监听命令是这样的:

ch.assertQueue(machineID, {exclusive: true, durable: false}, function (err, q) { 
    if (err) console.log(err) 
    console.log("opened queue") 
    ch.consume(q.queue, function (message) { 
     console.log(message.content.toString()) 
    }) 
}) 

当我发送到队列中,它会失败,由于独特的问题,在这条线的客户端:

ch.assertQueue(machineID, {}) 

但它会发送消息,如果我评论上面的行。

ch.sendToQueue(machineID, new Buffer(id.toString())) 

什么是最优雅的方式来解决这个问题?

+0

您能否发布错误信息? –

+0

405)RESOURCE_LOCKED - 无法获得锁定队列的独占访问权 –

+0

独占队列意味着您不能拥有多个使用者。如果您知道队列应该始终由消费者创建,那么每次发送消息时都不需要创建队列(最好在开始时创建队列)。一个可能的问题是队列被定义了不同的参数'{exclusive:true,durable:false}'和'{}'(默认情况下,exclusive排除错误)并且通常失败 - 参数应该是相同的。 –

回答

0

一种方法是创建“直接”类型的交换并将您的队列绑定到此交换。因此,如果您将任何消息传递给此交换机,那么它只会被路由到该名称与您传递给交换机的路由键名相同的队列。例如,所有具有路由关键字'12345'的消息将被这样的交换机路由到名为'12345'的队列。

相关问题