昨天从win换到mac。。配来配去的就拖更了。
也就停止营业了一天
那今天
我胡汉三又回来了
我们上次说到面包保质期以及面包坏了丢到哪
那我们今天来解决一下
总所周知,保质期是商家说了算
那我就有两个选择:
一、我所有面包都是同一个保质期(统一设置队列中消息的过期时间)
二、不同的产品保质期不同(设置指定消息的过期时间)
我们在RabbitMQ中把这个保质期叫做TTL(Time to Live)
那么我们先瞅瞅不同保质期的做法:
@RestController
public class Producer {
@Autowired
private RabbitTemplate template;
@GetMapping("/makeLover")
public String makeLover() {
for (int i = 0; i < 50; i++) {
String msg = "send msg = " + I;
try {
//每发一条消息睡一会会
Thread.sleep(i * 10);
} catch (InterruptedException e) {
e.printStackTrace();
}
template.convertAndSend(AppConfig.EXCHANGE_NAME, AppConfig.ROUTING_KEY, msg,message -> {message.getMessageProperties().setExpiration("3000");return message;});
//这里设置保质期是三秒
}
return "OK";
}
}
由于只有三秒…但是我的手速还不够这么快的点到(没办法,有对象,手速自然就下来了)
所以这里无图,观众老爷可以自己在rabbitmq的管理页面看到哦~
然后让我们康康全部设置咋设置:
@Bean
public Queue queue() {
Map map = new HashMap();
map.put("x-message-ttl", 30000);
return new Queue(QUEUE_NAME, true, false, false, map);
}
image-20200328145239470.png
那我这里设置的是30秒
在这里有个问题,在我们这个queue已经创建出来之后,我们需要先删掉原有的queue,不然会报错。。。
那我们的保质期到此为止了
然后我们还得考虑一下,如果面包到了保质期的话,我们应该丢在一个地方
所以我们就有了死信队列:
死信队列介绍
- 死信队列:DLX,
dead-letter-exchange
- 利用DLX,当消息在一个队列中变成死信
(dead message)
之后,它能被重新publish到另一个Exchange,这个Exchange就是DLX
消息变成死信有以下几种情况
- 消息被拒绝(basic.reject / basic.nack),并且requeue = false
- 消息TTL过期
- 队列达到最大长度
死信处理过程
- DLX也是一个正常的Exchange,和一般的Exchange没有区别,它能在任何的队列上被指定,实际上就是设置某个队列的属性。
- 当这个队列中有死信时,RabbitMQ就会自动的将这个消息重新发布到设置的Exchange上去,进而被路由到另一个队列。
- 可以监听这个队列中的消息做相应的处理。
那可以知道的就是
消息-》交换机-〉队列-》消息失效-〉死信交换机-》死信路由-》死信队列-〉消费者消费
那试试:
@Bean
public Queue queue() {
Map map = new HashMap();
map.put("x-message-ttl", 30000);
//声明私信交换机
map.put("x-dead-letter-exchange", "dlx.exchange");
//声明私信路由
map.put("x-dead-letter-routing-key", "dlx.key");
return new Queue(QUEUE_NAME, true, false, false, map);
}
@Bean
public Queue deadQueue(){
Queue queue = new Queue("dead", true);
return queue;
}
@Bean
public Binding deadLetterBindding(){
return BindingBuilder.bind(deadQueue()).to(deadLetterExchange()).with("dlx.key");
}
@Bean
public DirectExchange deadLetterExchange() {
DirectExchange topicExchange = new DirectExchange("dlx.exchange", true, false);
return topicExchange;
}
我们康康结果
image-20200328153342772.png
image-20200328153356463.png
很明显,我们的普通队列已经可以发送消息到dlx了
那么等到消息失效,就可以直接进入私信队列了。
OK。RabbitMQ的事情就先暂且告一段落~
后续还会更新,至于更新什么。
还没想好~