springboot整合RabbitMQ 中的 TTL实例代码

作者:笑霸final 时间:2022-04-18 03:12:34 

TTL简介

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

springboot整合RabbitMQ 中的 TTL实例代码

配置类代码

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

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

注意 包别导错了

package com.xbfinal.springbootrabbitmq.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;

/**
* ttl队列 配置文件类
*
*/
@Configuration
public class TtlQueueConfig {

//普通交换机名称
   public static final String X_EXCHANGE="X";
   //死信交换机名称
   public static final String Y_DEAD_LETTER_EXCHANGE="Y";
   //普通队列名称
   public static final String QUEUE_A="QA";
   public static final String QUEUE_B="QB";
   //死信队列名称
   public static final String DEAD_LETTER_QUEUE_D="QD";

/**
    * 声明x交换机
    * @return
    */
   @Bean("xExchange")//别名和方法名取一样
   public DirectExchange xExchange(){
       return new DirectExchange(X_EXCHANGE);
   }

/**
    * 声明y交换机
    * @return
    */
   @Bean("yExchange")//别名和方法名取一样
   public DirectExchange yExchange(){
       return new DirectExchange(Y_DEAD_LETTER_EXCHANGE);
   }

//声明队列A
   @Bean("queueA")
   public Queue queueA(){
       final HashMap<String, Object> arguments
               = new HashMap<>();
       //设置死信交换机
       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);

return QueueBuilder.durable(QUEUE_A)
               .withArguments(arguments)
               .build();
   }

//声明队列B
   @Bean("queueB")
   public Queue queueB(){
        HashMap<String, Object> arguments
               = new HashMap<>();
       //设置死信交换机
       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);

return QueueBuilder.durable(QUEUE_B)
               .withArguments(arguments)
               .build();
   }

@Bean("queueD")
   public Queue queueD(){
       return QueueBuilder.durable(DEAD_LETTER_QUEUE_D)
               .build();
   }

/**
    * A队列绑定X交换机
    * @param queueA
    * @return
    */
   @Bean
   public Binding queueABindingX(@Qualifier("queueA")Queue queueA,
                                 @Qualifier("xExchange") DirectExchange xExchange){
       return BindingBuilder.bind(queueA).to(xExchange).with("XA");
   }

/**
    * B队列绑定X交换机
    * @param queueB
    * @param xExchange
    * @return
    */
   @Bean
   public Binding queueBBindingX(@Qualifier("queueB")Queue queueB,
                                 @Qualifier("xExchange") DirectExchange xExchange){
       return BindingBuilder.bind(queueB).to(xExchange).with("XB");
   }

/**
    * D队列绑定死信y交换机
    * @param queueD
    * @param yExchange
    * @return
    */
   @Bean
   public Binding queueDBindingX(@Qualifier("queueD")Queue queueD,
                                 @Qualifier("yExchange") DirectExchange yExchange){
       return BindingBuilder.bind(queueD).to(yExchange).with("YD");
   }

}

生产者代码

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

package com.xbfinal.springbootrabbitmq.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

/**
* 生产者
* 发送延迟消息
*/
@Slf4j
@RestController
@RequestMapping("/ttl")
public class SendMsgController {

@Autowired
   private RabbitTemplate rabbitTemplate;

@GetMapping("/sendMsg/{message}")
   public void sendMsg(@PathVariable String message){
       log.info("当前时间:{},发送了一条消息({})给两个队列", new Date().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 的方法处理,根据接受的参数类型进入具体的方法中。

package com.xbfinal.springbootrabbitmq.consumer;

import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.util.Date;

/**
* 队列TTL的消费者
*/
@Slf4j
@Component
public class DeadLetterQueueConsumer {

//接收消息
   @RabbitListener(queues = "QD")
   public void receivedD(Message message, Channel channel)throws Exception{
       String msg=new String(message.getBody());
       log.info("当前时间:{},收到消息:{}",new Date().toString(),msg);
   }
}

验证代码

先在历览器输入http://localhost:8080/ttl/sendMsg/%E7%AC%91%E9%9C%B8fianl

springboot整合RabbitMQ 中的 TTL实例代码

查看控制台:

springboot整合RabbitMQ 中的 TTL实例代码

来源:https://blog.csdn.net/weixin_52062043/article/details/127077941

标签:springboot,RabbitMQ,TTL
0
投稿

猜你喜欢

  • java实现对Hadoop的操作

    2021-10-05 16:30:37
  • 轻松学习C#的装箱与拆箱

    2021-07-01 12:11:51
  • Java基础高级综合练习题扑克牌的创建

    2023-09-08 06:56:19
  • Java微信公众平台开发(11) 微信三大平台的关联

    2022-10-15 06:55:56
  • 一文详解如何在控制台显示MyBatis的SQL语句

    2023-01-09 06:43:38
  • 深入学习Java编程中的字符串的进阶使用

    2023-11-11 12:54:20
  • Java 中的位运算与移位运算详解

    2022-03-10 09:34:19
  • jenkins+maven+svn自动部署和发布的详细图文教程

    2023-08-24 05:18:07
  • java 用itext设置pdf纸张大小操作

    2022-10-09 15:00:43
  • Android中实现EditText密码显示隐藏的方法

    2022-04-13 22:33:56
  • 如何实现Spring Event(异步事件)

    2023-08-23 05:06:47
  • Android AIDL实现与服务相互调用方式

    2021-08-09 10:57:40
  • Springboot之idea之pom文件图标不对问题

    2021-12-31 07:27:32
  • Java 实现repalceAll只替换第二个匹配到的字符串

    2021-06-12 11:56:20
  • 基于ArrayList源码解析(基于JDK1.8)

    2021-10-07 18:34:25
  • 总结Bean的三种自定义初始化和销毁方法

    2023-01-05 13:38:09
  • Hadoop源码分析六启动文件namenode原理详解

    2021-08-20 01:03:55
  • Springboot添加支付接口

    2023-06-21 00:10:20
  • C#中英文混合字符串截取函数

    2023-01-19 06:02:55
  • Java超详细讲解设计模式之一的单例模式

    2023-03-09 10:59:09
  • asp之家 软件编程 m.aspxhome.com