Closed yww325 closed 6 years ago
autoAck不是指代rmq是否已经ack的一个标记位,而是表示是否需要rmq执行autoAck。如果不需要自动执行ack(也就是autoAck为false),此时需要显式调用BasicAck,以便rmq可以做ack。而不管是否是需要进行autoAck,都设定消息已经被ack过了,所以在任何情况都会触发MessageAcknowledged事件。 autoAck默认为false,也就是必须显式调用了BasicAck,才会确认消息已经派发,否则RabbitMQ会保存未派发的消息,等到下次消息消费者在线的时候,还能继续处理未派发的消息。这对于云架构下的微服务实现是有帮助的,因为云服务下,服务器很有可能在无人值机的情况下宕机。
哦。那个if (!autoAck)应该是if (!this.autoAck).我还以为是Subscribe方法的一个参数,和是否需要rmq执行autoAck的初始化设置是两个东西。看错了。看来style cop的rulehttp://stylecop.soyuz5.com/SA1101.html 还是有点道理的。
if (!autoAck) { channel.BasicAck(eventArgument.DeliveryTag, false); }
应该是if (autoAck)才会去Ack并且调用OnMessageAcknowledged吧。