栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

04RabbitMq--ttl队列过期时间和死信队列

04RabbitMq--ttl队列过期时间和死信队列

TTL队列过期时间

表示对消息设置预期时间,在这个时间内都可以被消费者获取,一旦过了这个时间,队列就会被自动删除。目前有两种方法设置:

    通过队列属性设置,队列中所有消息都是相同的过期时间。对消息进行单独设置,不同的队列有不同的过期时间。
    如果同时使用上面两种方法,则以先达到设置的小的ttl时间为准,一旦过了时间,则会变成死信队列,消费者无法获取此队列中的消息。

1.配置类

@Configuration
public class ttlRabbitmqConfig {
    @Bean
    public Queue queue1(){
        Map args = new HashMap<>();
        args.put("x-message-ttl",5000);//设置过期时间
        return new Queue("ttl.queue",true,false,false,args);//声明队列
    }
    @Bean
    public DirectExchange ttlExchange() {//声明交换机
        return new DirectExchange("ttl_order_exchange", true, false);
    }
    @Bean
    public Binding bindingExchange() {//绑定交换机与队列关系
        return BindingBuilder.bind(queue1()).to(ttlExchange()).with("ttl");
    }
}

2.Service 层

public void makeOrderTtl(String userId, String productId, int num) {
        String orderNumer = UUID.randomUUID().toString();
        System.out.println("user:"+orderNumer);
        String routeKey = "ttl";
        // 发送订单信息给RabbitMQ fanout
        rabbitTemplate.convertAndSend(ttlExchangeName, routeKey, orderNumer);
    }

测试发现,生产者生产消息后5秒,队列中数据消息后消失,数据进入到死信队列。

死信队列

当一条消息在队列中出现一下三种情况如下,该消息就会变成一条死信。

    消息被拒绝(basic.reject/basic.nack)并且requeue=false消息ttl过期,达到过期时间向队列中发送消息条数达到最大长度,再次发送消息就会移到死信队列
    当消息在一个队列中变成一个死信后,如果配置了死信队列,它将重新发送到死信交换机,死信交换机将消息投递到一个队列上,这个队列就是死信队列。

    1.配置类
@Bean
    public Queue queue1(){
        //做了参数的变更和消费不会失败,会报错,需删除再重建
        Map args = new HashMap<>();
        args.put("x-message-ttl",5000);//声明过期时间参数
        args.put("x-dead-letter-exchange","dead_direct_exchange");//声明死信交换机参数
        args.put("x-dead-letter-routing-key","dead");//声明死信队列路由key参数
        return new Queue("ttl.queue",true,false,false,args);//创建队列
    }
    @Bean
    public DirectExchange ttlExchange() {
        return new DirectExchange("ttl_order_exchange", true, false);//交换机
    }
    @Bean
    public Binding bindingExchange() {
        return BindingBuilder.bind(queue1()).to(ttlExchange()).with("ttl");//绑定关系
    }

2.Service层

 //队列过期
    public void makeOrderTtl(String userId, String productId, int num) {
        String ttlExchangeName = "ttl_order_exchange";
        String routeKey = "ttl";
        String orderNumer = UUID.randomUUID().toString();
        System.out.println("user:"+orderNumer);
        // 发送订单信息给RabbitMQ fanout
        rabbitTemplate.convertAndSend(ttlExchangeName, routeKey, orderNumer);
    }

3.生产者发送消息

@Autowired
    private TtlService ttlService;
    @Test
    void contextLoads2Ttl() throws InterruptedException {
        ttlService.makeOrderTtl("1","1",12);
    }

测试后发现,生产者发送数据后到ttl队列,5秒后,消息就转移到dead队列中。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/736315.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号