RabbitMQ快速入门(五、TTL队列优化)

18 篇文章 0 订阅
5 篇文章 0 订阅

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

跟随B站尚硅谷的RabbtiMQ进行学习:
以下是B站RabbitMQ的视频:
RabbitMQ的TTL插件配置及实现
踩坑提示:建议跟随视频使用插件,你用的哪个版本的RabbitMQ就配置对应版本的插件。
插件的下载地址:
延时队列插件下载地址

提示:以下是本篇文章正文内容,下面案例可供参考

一、RabbitMQ插件实现延时队列

代码架构图:
在这里插入图片描述

二、代码实现DelayedExchange

1.配置文件类代码

在我们自定义的交换机中,这是一种新的交换类型,该类型消息支持延迟投递机制 消息传递后并不会立即投递到目标队列中,而是存储在 mnesia(一个分布式数据系统)表中,当达到投递时间时,才投递到目标队列中。

package com.xyh.springbootrabbitmq.Config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.CustomExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;

@Configuration
public class DelayedQueueConfig {
    public static final String DELAYED_QUEUE_NAME = "delayed.queue";
    public static final String DELAYED_EXCHANGE_NAME = "delayed.exchange";
    public static final String DELAYED_ROUTING_KEY = "delayed.routingKey";

    @Bean("delayedQueue")
    public Queue delayedQueue(){
        return new Queue(DELAYED_QUEUE_NAME);
    }

    @Bean("delayedExchange")
    public CustomExchange delayedExchange(){
        HashMap<String, Object> args = new HashMap<>();
        //自定义交换机类型
        args.put("x-delayed-type","direct");
        return new CustomExchange(DELAYED_EXCHANGE_NAME,"x-delayed-message",true,false,args);
    }

    @Bean
    public Binding bindingDelayedQueue(@Qualifier("delayedQueue") Queue queue, @Qualifier("delayedExchange") CustomExchange delayedExchange){
        return BindingBuilder.bind(queue).to(delayedExchange).with(DELAYED_ROUTING_KEY).noargs();
    }
}

2.Producer发布消息

@GetMapping("sendDelayMsg/{message}/{delayTime}")
    public void sendMsg2(@PathVariable String message,@PathVariable Integer delayTime){
        rabbitTemplate.convertAndSend(DELAYED_EXCHANGE_NAME,DELAYED_ROUTING_KEY,message,correlationData->{
            correlationData.getMessageProperties().setDelay(delayTime);
            return correlationData;
        });

        System.out.println("发送一条信息给两个TTL队列:"+"发布时间:"+new Date()+"消息内容:"+message+" delayTime: "+delayTime);
    }

3.Consumer消费消息


package com.xyh.springbootrabbitmq.consumer;


import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class receiveDelayedQueue {
    public static final String DELAYED_QUEUE_NAME = "delayed.queue";

    @RabbitListener(queues = DELAYED_QUEUE_NAME)
    public void receiveQueue(Message message){

        String s = new String(message.getBody());

        System.out.println("收到死信队列信息:"+"发布时间:"+new Date()+"消息内容:"+s);

    }
}

三、运行结果

MQ管理页面生成Queue:
在这里插入图片描述

idea控制台实现消息接收:发现延时时间小的先被消费掉
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值