2015-05-15 36 views
2

我有一個拒絕郵件的消費者,並確切知道爲什麼這些郵件被拒絕。她想在拒絕信息時向製片人提供「爲什麼」以及「什麼」。RabbitMQ - 帶元數據的基本拒絕

nack'ing消息的一個好的隊列體系結構是什麼,但是還發回描述消息爲什麼失敗的元數據? (在更高的層次上,如果生產者沒有采取任何措施處理'缺乏的原因代碼,我認爲從消費者那裏記錄原因代碼就足以提高可見度,所以問題就變得沒有實際意義了。 。像一個有趣的問題,假設其他)

回答

1

您可以使用RPC模型如下所述: https://www.rabbitmq.com/tutorials/tutorial-six-java.html 通過這種方式,您可以發送回發佈者的消息的原因。

您也可以考慮使用Dead Letter Exchanges擴展名,但您不能更改該消息,因此您只會通知您的消息已被拒絕。

隨着一點點的工作,在那裏你重定向nack消息,並使用標題屬性消息寫的原因,就像你可以創建一個交換:

Map<String, Object> myHeader = new HashMap<String, Object>(); 
myHeader("reason", "can't access to database");//<-- just an example 
AMQP.BasicProperties.Builder bob = new AMQP.BasicProperties.Builder(); 
bob.headers(myHeader); 

這樣就可以保持原有的消息並只修改標題。 (類似於死信消息)

希望它有幫助

0

我陷入了類似的問題。我的解決方案是在發送(使用屬性),然後在拒絕保存錯誤(將其與分配的ID關聯)到redis/memcached(我在redis中使用時間過期以不超載存儲)時爲每條消息分配唯一ID。在我的情況下,因爲我很快處理所有這些死信息,所以錯誤不應長期存在。

可能不那麼優雅,但我不希望手動發佈任何東西,並且首選依靠本機兔子功能,並且我沒有對代碼進行很多更改。