RabbitMQ持久化
让消息在RabbitMQ中保存
队列持久化
channel.queueDeclare(QUEUE_NAME, true, false, null);
注:如果之前的同名队列不是持久化的,需要先将原先同名队列删除
消息持久化
channel.basicPublish("", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes("UTF-8"))
注:此时只是告诉RabbitMQ要将消息保存到磁盘,但是依然存在当消息刚准备存储到磁盘的时候还没有存储玩,消息还在缓存的一个间隔点,持久性不强,后面发布确认可以处理在这个缺陷
不公平分发
实现
//更改在消费者(接受消息)
//默认是0,轮序分发,一次性分发所有队列
//设置之后限制了一次分发消息的数量,再设置手动确认机制,这样在消费者未提交Ack时,不会再给其分发消息,实现不公平分发
int prefetchCount = 1;//0是轮询分发
channel.basicQos(1);
注:prefetchCount是设置信道容量的大小,采用轮询的方式往信道里放消息。信道满了就跳过
rabbit内部对信道数量升序
预取值
(prefetch)信道可以一次性获取队列中的n条消息
含义:当前信道的最大的未发送确认的消息,都未达到之前,采用轮询分发
//注:某个消费者设置了限制值,如果该消费者处理完后队列如果还有消//息的话,也不会再分发给该消费者了
当1时,只能获取1条,处理完获取下一条;
当0时,为不限制,所以队列中的消息可以轮询着一次性发完