springboot整合RabbitMQ设置消息过期时间、设置优先级

一、设置消息优先级

支持消息优先级的MQ有Beanstalkd、RabbitMQ(版本3.5.0)。
支持0-255个优先级,但建议0-10个优先级。优先级对列使用时,优先级越多,对cpu和内存使用会增加。

@Configuration
public class DirectRabbitConfig {
 
    //队列
    @Bean
    public Queue DirectQueue() {
        
        Map<String, Object> map = new HashMap<>();
        //一般设置10个优先级,数字越大,优先级越高
        map.put("x-max-priority", 10);
        return new Queue("DirectQueue", true, false, false, map);
    }
 
    //Direct交换机
    @Bean
    DirectExchange DirectExchange() {
        return new DirectExchange("DirectExchange", true, false);
    }
 
    //将队列和交换机绑定
    @Bean
    Binding bindingDirect() {
        return BindingBuilder.bind(DirectQueue()).to(DirectExchange()).with("DirectRouting");
    }
 
}

二、设置消息过期时间

  1. 指定条消息的过期时间。
  2. 给队列设置消息过期时间,队列中的所有消息都有同样的过期时间。

给队列设置消息过期时间:

声明队列时需要设置x-message-ttl属性,并设置过期时间,推送到该队列中的所有消息,都会有一个10秒后过期的属性。

@Configuration
public class RabbitConfig {
 
    //队列DirectQueue
    @Bean
    public Queue DirectQueue() {
       
        Map<String, Object> map = new HashMap<>();
        // 队列中的消息未被消费20秒过期
        map.put("x-message-ttl", 20000); 
        return new Queue("DirectQueue", true, false, false, map);
    }
 
    //Direct交换机 
    @Bean
    DirectExchange DirectExchange() {
        return new DirectExchange("DirectExchange", true, false);
    }
 
    //将队列和交换机绑定
    @Bean
    Binding bindingDirect() {
        return BindingBuilder.bind(DirectQueue()).to(DirectExchange()).with("DirectRouting");
    }
 
}

指定条消息的过期时间

@RestController
public class SendMessageController {
 
    @Autowired
    RabbitTemplate rabbitTemplate; 
 
    @GetMapping("/sendMessage")
    public void sendMessage() {
 
        MessageProperties messageProperties = new MessageProperties();
        //设置过期时间
        messageProperties.setExpiration("10000"); 
 
            //这个参数是用来做消息的唯一标识
            //发布消息时使用,存储在消息的headers中
            CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
 
            User user = new User(1, "张三" + 1);
            Message message = new Message(JSON.toJSONString(user).getBytes(StandardCharsets.UTF_8), messageProperties);
 
       		rabbitTemplate.convertAndSend("DirectExchange", "DirectRouting", message, correlationData);
    
    }
}

注意:
RabbitMQ只会过期淘汰队列头部的消息。如果单独给一条消息设置ttl,先入队列的消息过期时间如果设置比较长,后入队列的设置时间比较短,那么消息就不会及时的被淘汰,会导致消息的堆积问题。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 是一个方便快捷的轻量级框架,提供了许多便利的功能和特性,其中就包括了 RabbitMQ整合功能。 RabbitMQ 是一个广泛使用的消息队列系统,具有高可靠性和可扩展性,能够在分布式系统中实现异步通信、解耦和任务调度等功能,因此对于分布式系统而言具备非常重要的价值。 在Spring Boot中,整合RabbitMQ 可以通过以下步骤完成: 1. 添加 RabbitMQ 的相关依赖:在 pom.xml 文件中添加 spring-boot-starter-amqp 依赖。 2. 配置 RabbitMQ 相关信息:通过 application.yml 或 application.properties 配置文件配置RabbitMQ 的基本信息,例如:连接地址、用户名、密码等。 3. 创建 RabbitMQ 模板:通过 RabbitTemplate 类提供的方法向 RabbitMQ 发送消息并接收响应信息。 4. 创建 Exchange 和 Queue:在 RabbitMQ 中创建 Exchange 和 Queue,Exchange 用于将消息路由到指定的 Queue 中。 5. 编写发送消息的代码:通过 RabbitTemplate 提供的方法send()发送消息,可以是简单字符串/对象/json等。 至此,我们已经实现了一个简单的 RabbitMQ 消息发送程序。但是在实际应用场景中,还需要具备更进一步完善的功能,例如:消息确认、消息持久化、消费者监听等功能,这些可以通过配置listener容器、消息确认机制以及使用DurableQueue,DurableExchange等参数来实现。 总之,RabbitMQ’s and Spring Boot的集成非常方便和快捷。通过简单的配置和实现,我们就可以使用 RabbitMQ 在分布式系统中实现异步通信、解决问题、任务调度等功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值