1.消息通知
因为queue的默认情况下是给消费者轮流分发消息的。当一个消费者挂了之后,还是会向它发送消息,这样的的话,就会造成消息的丢失。为了解决这个问题,RabbitMQ的方案是,设置参数,当消息发送给消费者后,消费者会回应queue。当queue收到信号后,才会把queue中的message删除。
boolean autoAck=false;//当autoAck为false的时候,当消费都收到信息后,会回复队列,我收到信息了。这样就不会造成队列的消息流失。
channel.basicConsume(QUEUE_NAME, autoAck, consumer);
2.消息持久
刚刚解决了queue与消费者之间的消息丢失问题,但是如果RabbitMQ挂了,也会把queue中的消息丢失。所以在rabbitMQ要做消息的持久化。当RabbitMQ挂了之后restart,现从硬盘中读取数据。
设置方案:
boolean durable = true;
channel.queueDeclare("hello", durable, false, false, null);
注意:
当rabbitMQ有名这hello的队列后,就不会更改了。如果更改的话会报错
3.消息失败分发
当autoACk的值为false的时候,同时consumer也很忙在处理事情。RabbitMQ把消息分发给consumer的话。这样也会造成消息的丢失。那么我们可以通过设置,记RabbitMQ把消息分发给有空的cumsuer
int prefetchCount = 1;
channel.basicQos(prefetchCount);