2017-10-15 857 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'的隊列。

相關問題