Rabbitmq通过死信队列实现过期监听

上一篇 << 下一篇 >>>Rabbitmq解决分布式事务思路


死信队列的作用及应用场景

死信队列又称为备胎队列,和正常队列一样拥有交换机、路由key和消费者。
死信队列不能够和正常队列存放在同一个服务器中,应该分开服务器存放,保证服务的高可用。

进入到私信队列的场景:
1).主队列中的消息过期了还没消费
2).主队列满了【mq是以个数来计算的,不是以内容大小计算】,生产者拒绝接受消息
3).主队列多次消费都是失败

死信队列完成定时任务/过期监听原理

当我们在下单的时候,往mq投递一个唯一订单号,设置有效期为30分钟,在失效的时候,订单号会往死信队列里传输,然后通过死信消费者消费即可监听订单过期判断。

核心代码

a、AmqpTemplate和RabbitTemplate相比,都能实现rabbitmq的调用,但RabbitmqTemplate的请求字段注释更加的直观
b、死信队列核心代码

/**
 * 死信队列的bean及绑定关系,和主队列的方式一致
 */
@Bean
public Queue dlxSmsQueue() {
    return new Queue(DLX_FANOUT_SMS_QUEUE);
}
@Bean
public TopicExchange dlxTopicExchange() {
    return new TopicExchange(DLX_EXCHANGE_SPRINGBOOT_NAME);
}
@Bean
public Binding dlxSmsBindingExchange(Queue dlxSmsQueue, TopicExchange dlxTopicExchange) {
    return BindingBuilder.bind(dlxSmsQueue).to(dlxTopicExchange).with("my.sms");
}

/**
 * 主队列创建时,需要绑定死信队列的交换机和路由键
 */
@Bean
public Queue smsQueue() {
    Map arguments = new HashMap<>(2);
    arguments.put("x-dead-letter-exchange", DLX_EXCHANGE_SPRINGBOOT_NAME);
    arguments.put("x-dead-letter-routing-key", "my.sms");
    return new Queue(FANOUT_SMS_QUEUE, true, false, false, arguments);
}

生产者添加有效期,来模拟死信队列的产生原因之一
@RequestMapping("/sendMsg")
public String sendMsg(String msg) {
    rabbitTemplate.convertAndSend("springboot_topic_exchange", "my.sms",msg, new MessagePostProcessor() {
        @Override
        public Message postProcessMessage(Message message) throws AmqpException {
            //过期时间设置为10s
            message.getMessageProperties().setExpiration(10000+"");
            return message;
        }
    });
    return "success";
}

/**
 * 死信队列消费者,和主队列一样的消费
 */
@Component
@RabbitListener(queues = "dlx_springboot_topic_sms_queue")
public class FanoutSmsConsumer {

    @RabbitHandler
    public void consumer(String msg){
        System.out.println("死信队列消费者收到消息:"+msg);
    }
}

推荐阅读:
<<<消息中间件的核心思想
<<<消息中间件常见问题汇总
<<<基于Netty简单手写消息中间件思路
<<<消息队列常用名词与中间件对比
<< << << << << << << << << << << << << << << << << << << << << << << << << << << << << << << <<

你可能感兴趣的:(Rabbitmq通过死信队列实现过期监听)