<div dir="ltr">I found this thread interesting but... we just pull the cable and let a peer take over :) ml</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Apr 3, 2014 at 12:47 PM, Simon MacMullen <span dir="ltr"><<a href="mailto:simon@rabbitmq.com" target="_blank">simon@rabbitmq.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="">On 03/04/14 17:28, Bertrand Guay-Paquet wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I tested this on RabbitMQ 3.2.4 and calling basicCancel for a consumer<br>
tag does not interfere with the ability to basicAck a message currently<br>
being processed<br>
</blockquote>
<br></div>
That is correct.<div class=""><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
(I used Thread.sleep() in the consumer to ensure the<br>
operation order). The handleCancelOk() method is only called after the<br>
handleDelivery() method returns.<br>
</blockquote>
<br></div>
That is also correct.<div class=""><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
 From what I could piece together, calling basicCancel queues the<br>
channel rpc command for execution after whatever is already queued. The<br>
consumer even consumes its buffered messages (basicQos > 1) before<br>
processing the cancel command.<br>
</blockquote>
<br></div>
So there has been a certain lack of clarity in this thread. Two key points:<br>
<br>
* It is absolutely fine and normal to acknowledge a message after its consumer has been cancelled. The message remains acknowledgeable until the channel it was delivered on closes.<br>
<br>
* Once you have received basic.cancel-ok, you will not receive any more deliveries for that consumer.<br>
<br>
So the way to cleanly[0] shut down a consumer in the Java client is:<br>
<br>
1) Invoke basicCancel()<br>
2) Process and acknowledge messages as usual<br>
3) When handleCancelOk() gets called and you have acknowledged all messages you received before it, you can then consider yourself done, close channels and connections as appropriate.<br>
<br>
[0] I am assuming "cleanly" here means without causing messages to be redelivered. Otherwise you can just pull the network cable :-)<br>
<br>
Cheers, Simon<span class="HOEnZb"><font color="#888888"><br>
<br>
-- <br>
Simon MacMullen<br>
RabbitMQ, Pivotal</font></span><div class="HOEnZb"><div class="h5"><br>
______________________________<u></u>_________________<br>
rabbitmq-discuss mailing list<br>
<a href="mailto:rabbitmq-discuss@lists.rabbitmq.com" target="_blank">rabbitmq-discuss@lists.<u></u>rabbitmq.com</a><br>
<a href="https://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss" target="_blank">https://lists.rabbitmq.com/<u></u>cgi-bin/mailman/listinfo/<u></u>rabbitmq-discuss</a><br>
</div></div></blockquote></div><br></div>