13 死信隊列

1 圖解

死信隊列

2 消息如何進入死信隊列

消息過期
隊列長度已滿
消息被拒絕且不再重新嘗試

3 應用場景

在定義業務隊列時,指定一個死信交換機,並綁定一個死信隊列
當消息變成死信時,該消息就會被髮送到該死信隊列上
這樣就方便我們查看消息失敗的原因

4 代碼樣例

4.1 生產者


/**
* 定義死信隊列相關信息
 */
public final static String deadQueueName = "dead_queue";
public final static String deadRoutingKey = "dead_routing_key";
public final static String deadExchangeName = "dead_exchange";
/**
 * 死信隊列 交換機標識符
 */
public static final String DEAD_LETTER_QUEUE_KEY = "x-dead-letter-exchange";
/**
 * 死信隊列交換機綁定鍵標識符
 */
public static final String DEAD_LETTER_ROUTING_KEY = "x-dead-letter-routing-key";

// 郵件隊列
private String FANOUT_EMAIL_QUEUE = "fanout_queue";
	
/**
* 配置死信隊列
 * 
 * @return
 */
@Bean
public Queue deadQueue() {
	Queue queue = new Queue(deadQueueName, true);
	return queue;
}

/*
* 創建死信交換機
*/
@Bean
public DirectExchange deadExchange() {
	return new DirectExchange(deadExchangeName);
}

/*
* 將死信隊列與死信交換機綁定
*/
@Bean
public Binding bindingDeadExchange(Queue deadQueue, DirectExchange deadExchange) {
	return BindingBuilder.bind(deadQueue).to(deadExchange).with(deadRoutingKey);
}

/**
* 聲明業務隊列,將死信交換機與隊列進行綁定
 * @return Queue 
 */
@Bean
public Queue fanOutQueue() {
	Map<String, Object> args = new HashMap<>(2);
	args.put(DEAD_LETTER_QUEUE_KEY, deadExchangeName);
	args.put(DEAD_LETTER_ROUTING_KEY, deadRoutingKey);
	return new Queue(FANOUT_EMAIL_QUEUE, true, false, false, args);
}

4.2 消費者

try {
	// 通知mq服務器刪除該消息
	channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
	// 消息放入死信隊列
	channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
}

5 注意事項

如果創建隊列時,未綁定死信交換機,如果想要綁定,需要將隊列刪除,重新創建
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章