springboot整合RabbitMQ的延时队列

该博客介绍了如何利用Docker拉取并运行RabbitMQ镜像,创建包含延时队列的配置,并展示了如何设置死信队列以处理超时消息。在Spring Boot应用中,配置了RabbitMQ的延时队列、交换机、普通队列以及相关绑定,并提供了发送和接收消息的示例代码。此外,还列出了RabbitMQ连接的application.properties配置参数。
摘要由CSDN通过智能技术生成
  1. docker搭建RabbitMq服务

    1.拉取镜像
    docker pull rabbitmq:management
    2. 运行镜像
    docker run -dit --name Myrabbitmq -e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=123456 -p 15672:15672 -p 5672:5672 rabbitmq:management

     

  2. Rabbit配置

    @Configuration
    public class RabbitMQConfig {
        //实现思路是一个交换机器可以绑定一个延时队列和多个普通队列 但是在延时队列生成之后 延时的时间就不可以更改了  除非重新生成 还有就是当前账号下才能看见生成的信息
        //延时队列
        public static final String delayQueue = "delayQueue";
    
        //正常队列
        public static final String normalQueue = "normalQueue";
    
        //交换机
        public static final String delayExchange = "delayExchange";
    
        //延时队列路由键
        public static final String DELAY_ROUTING_KEY = "delay-routing-key";
    
        //正常队列路由键
        public static final String NORMAL_ROUTING_KEY = "normal-routing-key";
    
        //广播队列
        public static final String MASSAGE_PRIAVTE_QUEUE = "public_msg_queue";
        //广播队列key
        public static final String MASSAGE_PRIAVTE_KEY = "public_routing_key";
        //私信队列
        public static final String MASSAGE_PUBLIC_QUEUE = "private_msg_queue";
        //私信队列key
        public static final String MASSAGE_PUBLIC_KEY = "private_routing_key";
        //交换机
        public static final String MASSAGE_EXCHANGE = "massage_exchange";
    
        @Bean
        public MessageConverter messageConverter() {
            return new Jackson2JsonMessageConverter();
        }
    
        //创建一个延时队列
        @Bean
        public Queue getDelayQueue() {
            Map args = new HashMap();
            /**
             * 消息生产者==》发送消息给交换机==》交换机通过路由key 把消息发送给延时队列
             * 10秒之后,延时队列将消息发送给普通队列
             */
            args.put("x-dead-letter-exchange", delayExchange);//消息过期之后消息发送给的交换机
            args.put("x-dead-letter-routing-key", NORMAL_ROUTING_KEY);//交换机发给指定路由的队列
            args.put("x-message-ttl", 10000);//设置消息超时时间
            return QueueBuilder.durable(delayQueue).withArguments(args).build();
        }
    
        //创建交换机
        @Bean
        public Exchange getDelayExchange() {
            return ExchangeBuilder.directExchange(delayExchange).durable(true).build();
        }
    
        //延时队列与交换机进行绑定
        @Bean
        public Binding bindDelay() {
            return BindingBuilder.bind(getDelayQueue()).to(getDelayExchange()).with(DELAY_ROUTING_KEY).noargs();
        }
    
        //创建普通队列
        @Bean
        public Queue getNormalQueue() {
            return new Queue(normalQueue);
        }
    
        //普通队列与交换机进行绑定
        @Bean
        public Binding bindNormal() {
            return BindingBuilder.bind(getNormalQueue()).to(getDelayExchange()).with(NORMAL_ROUTING_KEY).noargs();
        }
    }

     

  3. 参数加入死信队列

        @Autowired
    	private RabbitTemplate rabbitTemplate;
    
    	//创建订单 未在规定的时间内进行支付 取消订单
    	@Transactional
    	public ServerResponse<Map<String,String>>CreateOrder(String userId){
    		Map<String,String>maps=new HashMap<>();
            //发送延时消息
    		logger.info(String.format("参数:%s", userId));
    		rabbitTemplate.convertAndSend(RabbitMQConfig.delayExchange, RabbitMQConfig.DELAY_ROUTING_KEY, userId);
            map.put("params",userId);
    		return ServerResponse.createBySuccess(maps);
    	}

     

  4. 死信队列超时接收参数 

    //监听rabbit死信队列中的参数
    @RabbitListener(queues = "normalQueue")
    	public void ReciveDelayMessage(String orderId) {
    		logger.info(String.format("超时的参数:%s", orderId));
    	}

     

  5. application.properties配置文件 ip 账号 密码 虚拟机

    #RabbitMQ
    spring.rabbitmq.host=ip
    spring.rabbitmq.port=5672
    spring.rabbitmq.username=root
    spring.rabbitmq.password=123456
    spring.rabbitmq.virtual-host=/

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值