0


springboot整合RabbitMQ 中的 TTL

前言
👏作者简介:我是笑霸final,一名热爱技术的在校学生。
📝个人主页:个人主页1 || 笑霸final的主页2
📕系列专栏:本文写在java专栏
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,👍点赞👍 + 👀关注👀 + 🤏收藏🤏

springboot整合RabbitMQ 中的 TTL

TTL简介

TTL 是什么呢?TTL 是 RabbitMQ 中一个消息或者队列的属性,表明一条消息或者该队列中的所有消息的最大存活时间,单位是毫秒。换句话说,如果一条消息设置了 TTL 属性或者进入了设置 TTL 属性的队列,那么这条消息如果在 TTL 设置的时间内没有被消费,则会成为"死信"。
下面就根据这个图片来验证代码

在这里插入图片描述

配置类代码

这里写一些配置,比如创建队列 交换机 和它们之间的绑定关系

  • @Qualifier 注解与我们想要使用的特定 Spring bean 的名称一起进行装配,Spring 框架就能从多个相同类型并满足装配要求的 bean 中找到我们想要的,避免让Spring脑裂。我们需要做的是@Component或者@Bean注解中声明的value属性以确定名称

注意 包别导错了

packagecom.xbfinal.springbootrabbitmq.config;importorg.springframework.amqp.core.*;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importjava.util.HashMap;/**
 * ttl队列 配置文件类
 *
 */@ConfigurationpublicclassTtlQueueConfig{//普通交换机名称publicstaticfinalString X_EXCHANGE="X";//死信交换机名称publicstaticfinalString Y_DEAD_LETTER_EXCHANGE="Y";//普通队列名称publicstaticfinalString QUEUE_A="QA";publicstaticfinalString QUEUE_B="QB";//死信队列名称publicstaticfinalString DEAD_LETTER_QUEUE_D="QD";/**
     * 声明x交换机
     * @return
     */@Bean("xExchange")//别名和方法名取一样publicDirectExchangexExchange(){returnnewDirectExchange(X_EXCHANGE);}/**
     * 声明y交换机
     * @return
     */@Bean("yExchange")//别名和方法名取一样publicDirectExchangeyExchange(){returnnewDirectExchange(Y_DEAD_LETTER_EXCHANGE);}//声明队列A@Bean("queueA")publicQueuequeueA(){finalHashMap<String,Object> arguments
                =newHashMap<>();//设置死信交换机
        arguments.put("x-dead-letter-exchange",Y_DEAD_LETTER_EXCHANGE);//设置死信RoutingKey
        arguments.put("x-dead-letter-routing-key","YD");//设置TTL设置10秒过期
        arguments.put("x-message-ttl",10000);returnQueueBuilder.durable(QUEUE_A).withArguments(arguments).build();}//声明队列B@Bean("queueB")publicQueuequeueB(){HashMap<String,Object> arguments
                =newHashMap<>();//设置死信交换机
        arguments.put("x-dead-letter-exchange",Y_DEAD_LETTER_EXCHANGE);//设置死信RoutingKey
        arguments.put("x-dead-letter-routing-key","YD");//设置TTL设置40秒过期
        arguments.put("x-message-ttl",40000);returnQueueBuilder.durable(QUEUE_B).withArguments(arguments).build();}@Bean("queueD")publicQueuequeueD(){returnQueueBuilder.durable(DEAD_LETTER_QUEUE_D).build();}/**
     * A队列绑定X交换机
     * @param queueA
     * @return
     */@BeanpublicBindingqueueABindingX(@Qualifier("queueA")Queue queueA,@Qualifier("xExchange")DirectExchange xExchange){returnBindingBuilder.bind(queueA).to(xExchange).with("XA");}/**
     * B队列绑定X交换机
     * @param queueB
     * @param xExchange
     * @return
     */@BeanpublicBindingqueueBBindingX(@Qualifier("queueB")Queue queueB,@Qualifier("xExchange")DirectExchange xExchange){returnBindingBuilder.bind(queueB).to(xExchange).with("XB");}/**
     * D队列绑定死信y交换机
     * @param queueD
     * @param yExchange
     * @return
     */@BeanpublicBindingqueueDBindingX(@Qualifier("queueD")Queue queueD,@Qualifier("yExchange")DirectExchange yExchange){returnBindingBuilder.bind(queueD).to(yExchange).with("YD");}}

生产者代码

我们用

Controller

写,通过网页提交的方式 生产消息
url:http://localhost:8080/ttl/sendMsg/

message
packagecom.xbfinal.springbootrabbitmq.controller;importlombok.extern.slf4j.Slf4j;importorg.springframework.amqp.rabbit.core.RabbitTemplate;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjava.util.Date;/**
 * 生产者
 * 发送延迟消息
 */@Slf4j@RestController@RequestMapping("/ttl")publicclassSendMsgController{@AutowiredprivateRabbitTemplate rabbitTemplate;@GetMapping("/sendMsg/{message}")publicvoidsendMsg(@PathVariableString message){
        log.info("当前时间:{},发送了一条消息({})给两个队列",newDate().toString(),message);//发送消息
        rabbitTemplate.convertAndSend("X","XA","10秒"+message);
        rabbitTemplate.convertAndSend("X","XB","40秒"+message);}}

消息消费者代码

注意@RabbitListener注解
@RabbitListener注解指定目标方法来作为消费消息的方法,通过注解参数指定所监听的队列或者Binding。使用@RabbitListener可以设置一个自己明确默认值的RabbitListenerContainerFactory对象。

  • @RabbitListener标注在方法上,直接监听指定的队列,此时接收的参数需要与发送市类型一致
  • 3.@RabbitListener 可以标注在类上面,需配合 @RabbitHandler 注解一起使用 @RabbitListener 标注在类上面表示当有收到消息的时候,就交给 @RabbitHandler 的方法处理,根据接受的参数类型进入具体的方法中。
packagecom.xbfinal.springbootrabbitmq.consumer;importcom.rabbitmq.client.Channel;importlombok.extern.slf4j.Slf4j;importorg.springframework.amqp.core.Message;importorg.springframework.amqp.rabbit.annotation.RabbitListener;importorg.springframework.stereotype.Component;importjava.util.Date;/**
 * 队列TTL的消费者
 */@Slf4j@ComponentpublicclassDeadLetterQueueConsumer{//接收消息@RabbitListener(queues ="QD")publicvoidreceivedD(Message message,Channel channel)throwsException{String msg=newString(message.getBody());
        log.info("当前时间:{},收到消息:{}",newDate().toString(),msg);}}

验证代码

先在历览器输入

http://localhost:8080/ttl/sendMsg/%E7%AC%91%E9%9C%B8fianl

在这里插入图片描述
查看控制台:

在这里插入图片描述


本文转载自: https://blog.csdn.net/weixin_52062043/article/details/127077941
版权归原作者 笑霸final 所有, 如有侵权,请联系我们删除。

“springboot整合RabbitMQ 中的 TTL”的评论:

还没有评论