美文网首页消息队列
8.死信队列、延迟队列和优先级队列

8.死信队列、延迟队列和优先级队列

作者: 12点前睡觉hhh | 来源:发表于2019-05-28 19:07 被阅读0次

1.死信队列

全称Dead-Letter-Exchange,DLX。
当一个消息在队列中变成死信以后,它能被重新发送到另外一个交换器中,也就是死信交换器。
消息变成死信的一般情况:
1.消息被拒,并且requeue设置为false。
2.消息过期。
3.队列达到最大长度。
DLX与一般的交换器没有什么区别,它能在任何队列上被指定,当这个队列中存在私信时,Rabbit'MQ就会自动将死信重新发布到指定的DLX上去,进而被路由到另一个队列,即死信队列。可以监听这个队列中的消息,进行处理。
可以通过在channel.queueDeclare方法中设置x-dead-letter-exchange 参数为这个队列添加DLX。
实例:

        Map<String,Object> args=new HashMap<>();
        args.put("x-dead-letter-exchange","dlx_exchange");
        channel.queueDeclare("demo",true,false,false,args);
        channel.exchangeDeclare("dlx_exchange","direct");

以上代码声明了一个demo队列和一个dlx_exchange交换器,并且将dlx_exchange作为demo队列的死信队列

2.延迟队列

延迟队列存储的是延迟消息,延迟消息是指消息被发送以后,并不想让消费者立刻拿到消息,而是等待待定时间后,消费者拿到消息进行消息。
在AMQP协议和RabbitMQ中并没有直接支持延迟队列,但是可以通过DLX和TTL模拟延迟队列。


image.png

3.优先级队列

优先级队列是指高优先级的队列具有高优先权,优先级高的消息具有优先被消费的权力。
可以通过x-max-priority参数设置队列的优先级

        Map<String,Object> args=new HashMap<>();
        args.put("x-max-priority",10);
        channel.queueDeclare("demo",true,false,false,args);
      

上述代码声明了一个优先级为10的优先队列

       AMQP.BasicProperties.Builder builder=new AMQP.BasicProperties.Builder();
        builder.priority(5);
        AMQP.BasicProperties properties=builder.build();
        channel.basicPublish(EXCHANGE_NAME, "item.insert", properties, message.getBytes());

上述代码发送了一条优先级为5的消息。

前提:如果消费者的消费速度大于生产者的生产速度且Broker中没有消息堆积的情况下,对发送的消息设置优先级没有什么意义。

相关文章

网友评论

    本文标题:8.死信队列、延迟队列和优先级队列

    本文链接:https://www.haomeiwen.com/subject/yundtctx.html