1. 簡介
1.1 DLX簡介
DLX: Dead-Letter-Exchange 死信交換器,死信郵箱
當(dāng)消息成為Dead message后,可以被重新發(fā)送到另一個交換機(jī),這個交換機(jī)就是DLX。
如下圖所示:
其實(shí)死信隊(duì)列就是一個普通的交換機(jī),有些隊(duì)列的消息成為死信后,(比如過期了或者隊(duì)列滿了)這些死信一般情況下是會被 RabbitMQ 清理的。但是你可以配置某個交換機(jī)為此隊(duì)列的死信交換機(jī),該隊(duì)列的消息成為死信后會被重新發(fā)送到此 DLX 。怎么處理這個DLX中的死信就是看具體的業(yè)務(wù)場景了,DLX 中的信息可以被路由到新的隊(duì)列。
2.2 出現(xiàn)死信的情況
- 隊(duì)列長度到達(dá)限制,無法加入新的消息
- 消費(fèi)者拒接消費(fèi)消息,并且不重回隊(duì)列。該信息會被清除并進(jìn)入死信隊(duì)列
- 原隊(duì)列存在消息過期設(shè)置,消息到達(dá)超時時間未被消費(fèi)
2.3 代碼示例
死信隊(duì)列可以定義單條消息和整個隊(duì)列死信,分別是下方的2和4。
2.代碼示例
以下定義了兩個交換機(jī),分別是普通交換機(jī)和死信交換機(jī),定義了兩個隊(duì)列,分別是普通隊(duì)列和死信隊(duì)列。
@Configuration
public class RabbitConfig {
final static String exchangeNormalName = "exchange.dlx.normal";
final static String queueNormalName = "queue.dlx.normal";
final static String exchangeDeadName = "exchange.dlx.dead";
final static String queueDeadName = "queue.dlx.dead";
//正常交換機(jī)
@Bean
public DirectExchange normalExchange(){
return ExchangeBuilder.directExchange(exchangeNormalName).build();
}
//正常隊(duì)列
@Bean
public Queue normalQueue(){
Map<String, Object> map = new HashMap<>();
map.put("x-message-ttl", 20000);//設(shè)置20s的過期時間
map.put("x-dead-letter-exchange", exchangeDeadName);//設(shè)置死信交換機(jī)名字
map.put("x-dead-letter-routing-key", "error");//設(shè)置死信交換機(jī)路由k
return QueueBuilder.durable(queueNormalName)
.withArguments(map)
.build();
}
@Bean
public Binding normalBinding(DirectExchange normalExchange, Queue normalQueue){
return BindingBuilder.bind(normalQueue).to(normalExchange).with("order");
}
//死信交換機(jī)
@Bean
public DirectExchange dlxExchange(){
return ExchangeBuilder.directExchange(exchangeDeadName).build();
}
//死信隊(duì)列
@Bean
public Queue dlxQueue(){
return QueueBuilder.durable(queueDeadName).build();
}
@Bean
public Binding dlxBinding(DirectExchange dlxExchange, Queue dlxQueue){
return BindingBuilder.bind(dlxQueue).to(dlxExchange).with("error");
}
}
如上,設(shè)置普通交換機(jī)把過期內(nèi)容放置到死信交換機(jī)中去。最重要的幾行代碼如下:
- map.put(“x-message-ttl”, 20000);//設(shè)置20s的過期時間
- map.put(“x-dead-letter-exchange”, exchangeDeadName);//設(shè)置死信交換機(jī)名字
- map.put(“x-dead-letter-routing-key”, “error”);//設(shè)置死信交換機(jī)路由key
3.測試結(jié)果
經(jīng)過20s之后,如下,將普通隊(duì)列的信息放入死信隊(duì)列中
其中TTL代表x-message-ttl,DLX代表x-dead-letter-exchange,DLK代表x-dead-letter-routing-key
4.單條消息
上方是將整個隊(duì)列設(shè)置過期時間,也可以將單條消息設(shè)置過期時間,即不給整個隊(duì)列設(shè)置過期時間
//map.put("x-message-ttl", 20000);//設(shè)置20s的過期時間
map.put("x-dead-letter-exchange", exchangeDeadName);//設(shè)置死信交換機(jī)名字
map.put("x-dead-letter-routing-key", "error");//設(shè)置死信交換機(jī)路由k
而是在消息體中設(shè)置過期時間
@Component
@Slf4j
public class MessageService {
@Autowired
private RabbitTemplate rabbitTemplate;
public void senMsg() throws InterruptedException {
//定義消息
String msg="單條消息過期時間test";
MessageProperties messageProperties = new MessageProperties();
messageProperties.setExpiration("10000"); //10s
Message message= MessageBuilder.withBody(msg.getBytes()).andProperties(messageProperties).build();
//發(fā)消息
rabbitTemplate.convertAndSend("exchange.dlx.normal","order",message);
log.info("消息發(fā)送完畢,發(fā)送時間為:{}", new Date());
}
}
文章來源:http://www.zghlxwxcb.cn/news/detail-716248.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-716248.html
到了這里,關(guān)于RabbitMQ-死信交換機(jī)和死信隊(duì)列的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!