一. net用戶端介紹
http://www.cnblogs.com/hsyzero/p/6297644.html
二. RabbitMQ消息應答
執行一個任務可能需要花費幾秒鐘,你可能會擔心如果一個消費者在執行任務過程中挂掉了。一旦RabbitMQ将消息分發給了消費者,就會從記憶體中删除。在這種情況下,如果正在執行任務的消費者當機,會丢失正在處理的消息和分發給這個消費者但尚未處理的消息。
但是,我們不想丢失任何任務,如果有一個消費者挂掉了,那麼我們應該将分發給它的任務傳遞給另一個消費者去處理。
為了確定消息不會丢失,RabbitMQ支援消息應答。消費者發送一個消息應答,告訴RabbitMQ這個消息已經接收并且處理完畢了。RabbitMQ就可以删除它了。
如果一個消費者挂掉卻沒有發送應答,RabbitMQ會了解為這個消息沒有處理完全,然後交給另一個消費者去重新處理。這樣,你就可以确認即使消費者偶爾挂掉也不會丢失任何消息了。
沒有任何消息逾時限制;隻有當消費者挂掉時,RabbitMQ才會重新投遞。即使處理一條消息會花費很長的時間。
消息應答是預設打開的。我們通過顯示的設定autoAsk=true關閉這種機制。現即自動應答開,一旦我們完成任務,消費者會自動發送應答。通知RabbitMQ消息已被處理,可以從記憶體删除。如果消費者因當機或連結失敗等原因沒有發送ACK(不同于ActiveMQ,在RabbitMQ裡,消息沒有過期的概念),則RabbitMQ會将消息重新發送給其他監聽在隊列的下一個消費者。
代碼示例:
生産者端代碼不變,消費者端代碼這部分就是用于開啟手動應答模式的。
[java]
// 監聽隊列,手動傳回完成
channel.basicConsume(QUEUE_NAME, false, consumer);
注:第二個參數值為false代表關閉RabbitMQ的自動應答機制,改為手動應答。
在處理完消息時,傳回應答狀态。
[java]
// 傳回确認狀态
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);