2017-10-09 40 views
0

我正在關注以下教程: https://www.rabbitmq.com/tutorials/tutorial-two-java.html我如何讓RabbitMQ重新傳遞未確認的消息?

我啓動的RabbitMQ服務器這樣的:

docker pull rabbitmq 
docker run -d --hostname my-rabbit-host --name my-rabbit -p 5672:5672 rabbitmq:3 

從教程:

使用此代碼,我們可以肯定的是,即使你殺了使用 同時CTRL + C工人正在處理一條消息,沒有東西會丟失。工作人員死後所有未確認的消息都會重新發送,很快 。

我產卵兩位消費者,當我CTRL + C其中之一,其他運行一個不收到原本註定要前消費者的消息。如何在CTRL + C退出其中一個消費者後獲得消息重新發送?

編輯:我現在通過'brew'安裝RabbitMQ,但我仍然看到相同的問題。

brew update 
brew install rabbitmq 
/usr/local/sbin/rabbitmq-server & 
+0

從你所描述的來看,它應該是開箱即用的。你是不是在睡覺時用睡覺而不是「doWork」的東西來阻止消費者? (顯然,一旦消息是「basicAcked」,它將不會再次傳遞給任何消費者)。您確定其他消費者實際上在消費嗎? – user1527491

+0

正確 - 我在睡覺之前就睡了一覺。我在睡眠期間按CTRL + C。我在消費者的handleDelivery()回調中打印消息,但它永遠不會通過。 – Phillip

+0

如果您同時使用兩種消費者,他們平均收到消息還是收到消息始終是相同的?如果它始終是同一個消費者,那麼可能表示第二個消費者未正確配置(例如未正確綁定到隊列)。爲了更加自信,在隊列中放入一些消息並確保它們同時消耗。 此外,使用'rabbitmq:3-management'泊塢窗圖像(+轉發15672並打開它的瀏覽器,用戶名是'guest',密碼是'guest')來查找隊列中消息的實際發生情況。 – user1527491

回答

0

沒有必要在客戶代碼中放置睡眠或類似的東西。在您提供的鏈接上,搜索以手動消息確認開頭的段落,然後查看該代碼。關鍵是不承認信息。如果您將autoACK標誌設置爲true,那麼您可以調用任何您想要的內容,只要收到該消息就立即得到確認。因此,不要設置該標誌,並且爲了測試,您也可以註釋掉channel.basicAck(envelope.getDeliveryTag(), false);行,以便不執行手動確認。所以當消費者退出時,消息仍然在隊列中。

+0

嗯,似乎仍然沒有工作。讓我知道你是否想看代碼。 – Phillip

+0

@Phillip當然,請將您的代碼添加到問題中 – cantSleepNow