- Dead Letter Exchange 的縮寫
- DLX也叫死信郵箱(網上的譯法),死信交換機(字面翻譯)。歸根結底就是一個交換機,當隊列中出現死信時,經過這個交換機將死信從新發送到死信隊列中(指定好rabbitmq會自動發送)。
什麼是死信呢?官方給出三個說法:測試
- 消息被拒絕(basic.reject或basic.nack)而且requeue=false.
- 消息TTL過時
- 隊列達到最大長度(隊列滿了,沒法再添加數據到mq中)
在定義業務隊列的時候,要考慮指定一個死信交換機,死信交換機能夠和任何一個普通的隊列進行綁定,而後在業務隊列出現死信的時候就會將數據發送到死信隊列。ui
死信隊列實際上就是一個普通的隊列,只是這個隊列跟死信交換機進行了綁定,用來存放死信而已。翻譯
#####定義業務(普通)隊列的時候指定參數code
x-dead-letter-exchange
: 用來設置死信後發送的交換機x-dead-letter-routing-key
:用來設置死信的routingKey
![![]rabbitmq
@Bean public Queue mailQueue() { Map<String, Object> map = new HashMap<String, Object>(); map.put("x-dead-letter-exchange", "dead_letter_exchange");//設置死信交換機 map.put("x-dead-letter-routing-key", "mail_queue_fail");//設置死信routingKey Queue queue = new Queue("mailQueue",true, false, false, map); return queue; }
@Bean public DirectExchange mailExchange() { return new DirectExchange("mailExchange", true, false); }
@Bean public Binding mailBinding() { return BindingBuilder.bind(mailQueue()).to(mailExchange()) .with(mailRoutingKey); }
@Bean public Queue deadQueue(){ Queue queue = new Queue("dead", true); return queue; }
@Bean public Binding deadLetterBindding(){ return BindingBuilder.bind(deadLetterQueue()).to(deadLetterExchange()).with("mail_queue_fail"); }
開始打算定義一個mailErrorQueue來記錄消費失敗的消息的,後來感受不是特別方便,用RabbitMQ自帶的死信郵件機制更好一些。 DLX即死信交換機,DLK即死信路由鍵(routingKey)隊列
當咱們消費的時候經過使用basic.reject和basic.nack便可,我這裏使用的是reject。
channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
圖片