2016-04-29 23 views
1

我使用php + RabbitMQ + MySQL進行了一些修改。如何在php中使用RabbitMQ重複檢索兩次或兩次以上的相同消息

我有工人在PHP,更新數據庫中的一個記錄。現在我試圖讓正確的 工作,如果服務器MySQL消失了。

我在做什麼: 我試圖重新連接數據庫10次,如果我不能 - 需要返回這個按摩回RabbitMQ。

用於接受消息我使用basic_ack,用於拒絕我使用basic_nack


實施例:

if ($can_accept_message) { 
     $message->delivery_info['channel']->basic_ack($message->delivery_info['delivery_tag']); 

    } else { 
     $message->delivery_info['channel']->basic_nack($message->delivery_info['delivery_tag']); 
    } 

但是basic_nack刪除隊列此消息,我無法再次重複它;(

試圖像這樣:https://github.com/php-amqplib/php-amqplib/blob/d2b8a292f709b79b1615bef87b1b89bde4c7c347/demo/basic_nack.php

閱讀本:https://github.com/php-amqplib/php-amqplib/issues/221

但它仍然無法正常工作。

怎麼回事?也許你有其他想法?

+0

您可以向我們展示你的隊列配置好嗎?和其他虛擬問題,你確定你進入'else'? – olibiaz

+0

** >>你能告訴我們您的隊列請的配置** 嘗試是這樣的:https://github.com/php-amqplib/php-amqplib/blob/d2b8a292f709b79b1615bef87b1b89bde4c7c347/demo/basic_nack.php ** >>和其他虛擬問題,你確定你在其他地方輸入?** 是 –

回答

1

看來功能basic_nack定義如下:

/** 
* Rejects one or several received messages 
* 
* @param string $delivery_tag 
* @param bool $multiple 
* @param bool $requeue 
*/ 
public function basic_nack($delivery_tag, $multiple = false, $requeue = false) 

正如你所看到的,第三個參數是$requeue = false

你應該嘗試

else { 
    $message->delivery_info['channel']->basic_nack($message->delivery_info['delivery_tag'], false, true); 
} 
+0

我tryind寫就像你說的,但它沒有幫助=( 也許我需要添加別的東西? –

+0

你是否處理消息消息還是你批量處理?如果你批量處理,第二個參數也應該是'true',所以可以肯定的是,你的消息在'basic_nack(...)'後面的隊列中被刪除了嗎? – olibiaz

+0

I undestand this ,並且我確定 –