2012-05-04 48 views
0

我在3臺工作機器上通過AMQP gem運行rabbitmq。當機器重新啓動時,我的隊列顯示工人只被添加,而不是退訂。例如,假設每臺機器運行5名工人:當機器關閉時退訂兔子隊列

當我啓動了3臺機器,我有15名工人訂閱隊列 當我關閉所有3臺機器,我仍然有15名工人訂閱隊列 當我重新啓動這3臺機器,我現在有30名工人訂閱隊列

實際上,我應該只有15名工人。

如何確保在機器重新啓動/關閉時與我的任務隊列的連接關閉?我曾嘗試過:

Signal.trap("INT") do #handles the ctrl c case 
    connection.close do 
     EM.stop { exit } 
    end 
    end 

    Signal.trap("TERM") do #handles the reboot and shut down case 
    connection.close do 
     EM.stop { exit } 
    end 
    end 

這不行。

回答

1

我認爲你在找什麼是Consumer cancellation Notification擴展名。

在你的情況,客戶端還沒有被通知的機器重新啓動的(換句話說,他們沒有從RabbitMQ的經紀人收到了「basic.cancel」通知時,機器重新啓動)。

見從上面的鏈接所採取的摘錄:

的延長期的經紀人會在這樣的意想不到的消費者取消的情況下,向客戶端發送一個basic.cancel。在代理從客戶端收到basic.cancel的情況下,這不會被髮送。 AMQP 0-9-1客戶端默認情況下不會期望從代理異步接收basic.cancel方法,因此爲了實現此行爲,客戶端必須在其客戶端屬性中提供功能表,其中存在關鍵consumer_cancel_notify和布爾值真正

我不是一個紅寶石程序員,但我認爲上面的鏈接中的java示例應該給你的全部圖片。