赞
踩
死信队列
面试题:你们是如何保证消息不丢失的?
1、什么是死信
在 RabbitMQ 中充当主角的就是消息,在不同场景下,消息会有不同地表现。
死信就是消息在特定场景下的一种表现形式,这些场景包括:
3、那么,我们到底如何来使用死信队列呢?
死信队列基本使用,只需要在声明业务队列的时候,绑定指定的死信交换机和RoutingKey即可。
public class DeadConsumer {
//死信交换机
@Bean
public DirectExchange deadExchange(){
return ExchangeBuilder.directExchange(“Dead_E01”).build();
}
//死信队列
@Bean
public Queue deadQueue1(){
return QueueBuilder.durable(“Dead_Q01”).build();
}
//死信交换机与死信队列的绑定
@Bean
public Binding deadBinding1(Queue deadQueue1,DirectExchange deadExchange){
return BindingBuilder.bind(deadQueue1).to(deadExchange).with(“RK_DEAD”);
}
//业务队列
@Bean
public Queue queue1(){
return QueueBuilder
.durable(“Direct_Q01”)
.deadLetterExchange(“Dead_E01”)
.deadLetterRoutingKey(“RK_DEAD”)
//.ttl(10*1000) //该属性是队列的属性,设置消息的过期时间,消息在队列里面停留时间n毫秒后,就会把这个消息投递到死信交换机,针对的是所有的消息
//.maxLength(20) //设置队列存放消息的最大个数,x-max-length属性值,当队列里面消息超过20,会把队列之前的消息依次放进死信队列
.build();
}
//业务交换机 @Bean public DirectExchange exchange(){ return ExchangeBuilder.directExchange("Direct_E01").build(); } //业务交换机与队列的绑定 @Bean public Binding binding1(Queue queue1,DirectExchange exchange){ return BindingBuilder.bind(queue1).to(exchange).with("RK01"); } //@RabbitListener(queues = "Direct_Q01") public void receiveMessage(OrderingOk msg) { log.info("消费者1 收到消息:"+ msg ); int i= 5/0; }
// @RabbitListener(queues = “Direct_Q01”)
// public void receiveMessage(OrderingOk msg,Message message, Channel channel) throws IOException {
//
// long deliveryTag = message.getMessageProperties().getDeliveryTag();
//
// System.out.println(“消费者1 收到消息:”+ msg +" tag:"+deliveryTag);
//
// channel.basicReject(deliveryTag, false);
// try {
// // 处理消息…
// int i= 5/0;
// // 如果处理成功,手动发送ack确认 ,Yes
// channel.basicAck(deliveryTag, false);
// } catch (Exception e) {
// // 处理失败,可以选择重试或拒绝消息(basicNack或basicReject) NO
// channel.basicNack(deliveryTag, false, false); // 并重新入队
//
// }
}
//}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。