RabbitMQ之死信交换机(延迟队列)

咱们接着上期内容继续https://blog.csdn.net/weixin_60389087/article/details/123140651?spm=1001.2014.3001.5501

一、源码编写

死信交换机的流程:

①、需要正常的交换机

②、正常队列发出信息(具备配置)

③、具备死信交换机,死信队列

1、创建队列,交换机以及绑定

DeadConfig:

package com.lv.code.mq;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

@Configuration
public class DeadConfig {

//    创建队列
//    正常队列
    @Bean
    public Queue normalQueue(){
        Map<String,Object> config=new HashMap<>();
//        过期时间
        config.put("x-message-ttl", 10000);//message在该队列queue的存活时间最大为10秒
//        死信交换机
        config.put("x-dead-letter-exchange", "deadExchange"); //x-dead-letter-exchange参数是设置该队列的死信交换器(DLX)
//        死信routing key
        config.put("x-dead-letter-routing-key", "DD");//x-dead-letter-routing-key参数是给这个DLX指定路由键
        return new Queue("normalQueue",true,false,false,config);
    }

//    死信队列
    @Bean
    public Queue deadQueue(){
        return new Queue("deadQueue",true);
    }

//    创建交换机
    @Bean
    public DirectExchange normalExchange(){
        return new DirectExchange("normalExchange");
    }

    @Bean
    public DirectExchange deadExchange(){
        return new DirectExchange("deadExchange");
    }

//    绑定
    @Bean
    public Binding normalBinding(){
        return BindingBuilder.bind(normalQueue()).to(normalExchange()).with("CC");
    }

    public Binding deadBinding(){
        return BindingBuilder.bind(deadQueue()).to(deadExchange()).with("DD");
    }


}

2、ProviderController内写方法

注入@slf4j注解

    @RequestMapping("/deadSend")
    public String deadSend(){
        log.warn("订单已经保存")
//        保存一个订单
        template.convertAndSend("normalExchange","CC","order-1902");
        return "yes";
    }

3、运行

 从normalQueue跳到deadQueue中:

 4、消费者

package com.lv.consumer1.mq;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@SuppressWarnings("all")
//消息队的监听器
@RabbitListener(queues = "deadQueue")
@Slf4j
public class DeadReceiver {

    @RabbitHandler
    public void process(String message){
        log.info(message+":该订单已过期");
    }

}

本期内容结束~~~~~~~~~~~~

猜你喜欢

转载自blog.csdn.net/weixin_60389087/article/details/123167193