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中没有消息堆积的情况下,对发送的消息设置优先级没有什么意义。