2016-02-18 154 views
0
String queueA = "rabbitmq://host:5672/queue-a.exchange?queue=queue-a.exchange..etc 

from(queueA) 
    .routeId("idForQueueA") 
    .onException(Exception.class) 
    .maximumRedeliveries(0) 
    // .processRef("sendEmailAlert") * not sure this belongs here* 
    .to(deadLetterQueueA) 
    .useOriginalMessage() 
    .end() 
    .processRef("dataProcessing") 
    .processRef("dataExporting") 
    .end(); 

解釋上面的代碼:阿帕奇駱駝 - 添加信息提示給死信隊列

消息從queueA服用。在各種進程成功之後,消息被消耗。如果失敗,則將其添加到死信隊列「deadLetterQueueA」中。這一切工作正常。

我的問題是

當消息在排隊死信我要添加警告到達,所以我們知道該做些什麼......怎麼可能當消息在到達我添加一個電子郵件警報死信隊列。如果警報失敗,我不想丟失原始消息 - 我也不希望警報消耗該消息。


我的想法是......我需要拆就那麼其發送給兩個不同的隊列異常的消息?一個用於警報,然後發送一個電子郵件警報,然後消耗自己。那麼只有一個用於剛剛在那裏的死信隊列?但我不知道如何做到這一點?

+0

使用像Zabbix這樣的監視工具來檢查死信隊列的隊列深度? – Ralf

回答

2

您可以分割的消息使用multicast(詳細here)去到多個端點:

.useOriginalMessage().multicast().to(deadLetterQueueA, "smtp://[email protected]:port?options") 

它使用駱駝的郵件組件的端點描述here。或者,您可以繼續處理to之後的消息。因此,像:

.useOriginalMessage() 
.to(deadLetterQueueA) 
.transform().simple("Hi <name>, there has been an error on the object ${body.toString}") 
.to("smtp://[email protected]:port?options") 

如果你有多個收件人,您可以使用recipients list

public class EmailListBean { 
    @RecipientList 
    public String[] emails() { 
     return new String[] {"smtp://[email protected]:port?options", 
       "smtp://[email protected]:port?options"}; 
    } 
} 

.useOriginalMessage() 
.to(deadLetterQueueA) 
.transform().simple("...") 
.bean(EmailListBean.class) 

小心使用JMS隊列來存儲郵件在等待人類行動它們。我不知道你收到了什麼類型的消息流量。我假設你是否想爲每次失敗發送一封電子郵件,這不是很多。但我通常會對這類事情保持警惕,並選擇使用日誌記錄或數據庫持久性來存儲錯誤的結果,並且只使用JMS錯誤隊列來通知其他進程或消費者錯誤或安排重試。

1

有兩種方法可以做到這一點,但根據您的消息量,您可能不希望在每封失敗的消息上發送電子郵件。

您可以使用AndyN提供的解決方案,或者您可以使用諮詢主題ActiveMQ.Advisory.MessageDLQd.Queue。*,每當消息進入DLQ時,主題的排隊計數將增加1。通過監控隊列深度,您現在可以根據發生的錯誤數量發送郵件。

如果你想在生產者端做到這一點。您可以使用AndyN提供的任何一種解決方案