RabbitMQ高级特性--DLX死信队列

rabbitmq专栏

代码地址: 码云

在这里插入图片描述
队列中的消息可能会变成死信消息(dead-lettered),进而当以下几个事件任意一个发生时,消息将会被重新发送到一个交换机:

  • 1、消息被消费者使用basic.reject或basic.nack方法并且requeue参数值设置为false的方式进行消息确认(negatively acknowledged)

  • 2、消息由于消息有效期(per-message TTL)过期

  • 3、消息由于队列超过其长度限制而被丢弃

注意,队列的有效期并不会导致其中的消息过期

核心配置:

  • x-dead-letter-exchange 指定死信交换机

  • x-dead-letter-routing-key 指定死信路由key

1. 测试消息有效期(per-message TTL)过期

1.1 RabbitMQConfig配置文件

	@Bean
    public Queue ttlDirectQueue(){
        Map<String,Object> map=new HashMap<>();
        map.put("x-message-ttl",10000);
        map.put("x-dead-letter-exchange",DLX_DIRECT_EXCHANGE);
        map.put("x-dead-letter-routing-key",DLX_DIRECT_ROUTINGKEY);
        map.put("x-max-length",100);
        return new Queue(TTL_DIRECT_QUEUE,true,false,false,map);
    }
	/**
     * DLX_direct交换机名称
     */
    public static final String DLX_DIRECT_EXCHANGE="dlxldirectExchange";

    /**
     * dlx_direct队列名称
     */
    public static final String DLX_DIRECT_QUEUE="dlxldirectQueue";

    /**
     * dlx_direct路由Key
     */
    public static final String DLX_DIRECT_ROUTINGKEY="dlx_directRoutingKey";

    /**
     * 定义一个DLX direct交换机
     * @return
     */
    @Bean
    public DirectExchange dlxDirectExchange(){
        return new DirectExchange(DLX_DIRECT_EXCHANGE);
    }

    /**
     * 定义一个DLX direct队列
     * @return
     */
    @Bean
    public Queue dlxDirectQueue(){
        return new Queue(DLX_DIRECT_QUEUE);
    }

    /**
     * dlx定义一个队列和交换机的绑定
     * @return
     */
    @Bean
    public Binding dlxDirectBinding(){
        return BindingBuilder.bind(dlxDirectQueue()).to(dlxDirectExchange()).with(DLX_DIRECT_ROUTINGKEY);
    }

1.2 producer

在这里插入图片描述

1.3 启动producer服务

控制台:

在这里插入图片描述
10秒后,消息进入了dlxldirectQueue,如下图:
在这里插入图片描述

2. 测试消息超过队列长度限制而被丢弃

2.1 修改RabbitMQConfig配置

在这里插入图片描述

2.2 发送20条消息

可以发现,10条消息进入了ttldirectQueue, 另外10条进入了dlxldirectQueue,如下图:
在这里插入图片描述

3. 测试消息拒签

消息被消费者使用basic.reject或basic.nack方法并且requeue参数值设置为false的方式进行消息确认(negatively acknowledged)

3.1 修改RabbitMQConfig配置

在这里插入图片描述
在这里插入图片描述

启动producer服务后,
由于队列长度限制最多为100,所以剩下100条消息进入了dlxldirectQueue死信队列,如下图:

在这里插入图片描述

3.2 消费者拒签

在这里插入图片描述
启动consumer服务后,由于剩下的100条消息发生了拒签,所以也进入了死信队列:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值