赞
踩
最近,刚刚项目用起了rabbitmq消息对列,出现了一个错误,拿出来,让大家一起看看,避免一些常见错误。
期初,我的消费者端是处理完数据后,通过channel.basicAck(envelope.getDeliveryTag(),false);来确认消息被成功消费掉了。如果出现其他情况包括异常,通过channel.basicReject(envelope.getDeliveryTag(),false);拒收消息。很正常,成功运行一段时间之后,我改了一下业务逻辑,不小心把上面的两个处理消息的方法写到了一起。也就是先确认消息被消费掉,然后又告诉服务器,消息被拒收。例如:
业务逻辑改前:
if(){
channel.basicAck(envelope.getDeliveryTag(),false);
}else{
channel.basicReject(envelope.getDeliveryTag(),false);
}
更改后:
if(){
channel.basicAck(envelope.getDeliveryTag(),false);
channel.basicReject(envelope.getDeliveryTag(),false);
}else{
channel.basicReject(envelope.getDeliveryTag(),false);
}
有意思不,哈哈哈,更改后的错误逻辑,导致channel通道关闭。并且没有报异常,甚是苦难,浪费了不少时间,希望给大家能避免此坑。
查问题期间,跟了一下rabbitmq的代码,由于初学rabbitmq,也没有弄明白为什么channel关闭了,并且没有报错。希望比较了解rabbitmq的同学能给与一些建议。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。