RabbitMQ之消息的自动应答、手动应答和消息持久化(Java开发)

1、消息的自动和手动应答 

boolean autoAck = true;//消息自动应答
channel.basicConsume(WQ_QUEUE,autoAck,consumer);

       默认情况下,rabbitmq开启了消息的自动应答。此时,一旦rabbitmq将消息分发给了消费者,就会将消息从内存中删除。这种情况下,如果正在执行的消费者被“杀死”或“崩溃”,就会丢失正在处理的消息。

       如果想要确保消息不丢失,我们需要设置消息应答方式为手动应答。设置为手工应答后,消费者接受并处理完一个消息后,会发送应答给rabbitmq,rabbitmq收到应答后,会将该条消息从内存中删除。如果一个消费者在处理消息的过程中“崩溃”,rabbitmq没有收到应答,那么”崩溃“前正在处理的这条消息会重新被分发到别的消费者。

boolean autoAck = false;//消息手动应答
channel.basicConsume(WQ_QUEUE,autoAck,consumer);

2、消息的持久化

       首先,大家思考一个问题:rabbitmq中的消息是存在内存中的,假设rabbitmq中的消息还没有分发完,突然rabbitmq的服务宕机,这时候,我们的消息自然会丢失。所以为了保证即使rabbitmq服务宕机,我们存在rabbitmq中的消息仍然不会丢失,就需要实现rabbitmq的消息持久化。

//队列持久存在,即使RabbitMQ退出或崩溃
boolean durable = true;
//声明队列
channel.queueDeclare(WQ_QUEUE,durable,false,false,null);

注意:如果你之前声明了一个未持久化的队列,例如队列名叫test_queue。此时你将代码中的boolean durable = false;改为boolean durable = true;尽管这在程序上看起来没有问题,但是它并不会对test_queue多列起作用,而且在你声明该队列的时候还会报错。这是因为rabbitmq不允许你使用不同的参数重新定义现有队列,并且会向尝试执行此操作的任何程序返回错误。

解决办法有两种:

1、通过rabbitmq的管理后台删除已存在的队列,然后再声明。

2、换一个队列名,重新声明一个新的队列。

你可能感兴趣的:(RabbitMQ)