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、换一个队列名,重新声明一个新的队列。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值