死信交換機: DLX,dead-letter-exchange
當消息在一個隊列中變成死信 (dead message) 之後,它能被重新 publish 到另一個 隊列
消息變成死信的原因有:
1.消息被拒絕 (basic.reject / basic.nack) 并且 reQueue=false
2.消息 TTL 過期
3.隊列達到最大長度了
死信隊列的使用場景
可以用做定時任務,也可以是存儲逾時消息,比如付費逾時之類的
私信隊列的使用
- 直接在管理頁面上建立
首先建立私信交換機demo.dead

再建立私信隊列demo.dead
綁定隊列和交換器
建立業務交換器demo
建立業務隊列demo
x-message-ttl: 指定消息逾時時間是10000ms
x-dead-letter-exchange: 指定死信交換器為demo.dead
x-dead-letter-routing-key: 指定死信的routingKey是demo.dead
在綁定業務隊列到業務交換器
- springboot應用中建立
public void createQueue(String topic, String queryName) throws IOException {
log.info("create queue : {}, {}, {}", topic, queryName);
RabbitChannelManager.MyChannel channel = rabbitChannelManager.getChannel();
/* 建立死信隊列 */
String deadQueueName = addDeadSuffix(queryName);
String deadRouteKey = addDeadSuffix(topic);
channel.getChannel().queueDeclare(deadQueueName, true, false, false, null);
channel.getChannel().queueBind(addDeadSuffix(queryName), rabbitConfiguration.getDeadExchange(), deadRouteKey);
/* 建立隊列,加入死信轉發參數 */
Map<String, Object> deadArgs = new HashMap<>();
deadArgs.put("x-message-ttl", rabbitConfiguration.getDeadMessageTtl());
deadArgs.put("x-dead-letter-exchange", rabbitConfiguration.getDeadExchange());
deadArgs.put("x-dead-letter-routing-key", deadRouteKey);
channel.getChannel().queueDeclare(queryName, true, false, false, deadArgs);
channel.getChannel().queueBind(queryName, rabbitConfiguration.getDefaultExchange(), topic);
rabbitChannelManager.returnChannel(channel);
}
複制
建立好的隊列清單
測試一下
發送一條消息到demo隊列,檢視隊列情況
可以看到demo隊列有一條消息
等待一會後再看隊列情況
可以看到該消息已經因為逾時而轉發到了demo.dead死信隊列
另外兩種情況也是同樣的結果就不多寫了