[rabbitmq-discuss] Duplicate Messages received after basicRecoveryAsync() is called.

Matthias Radestock matthias at lshift.net
Fri Feb 26 16:08:55 GMT 2010


John,

John Mann wrote:
> By design, the RabbitMQConsumer does not acknowledge a message if the
> RawConsumer throws an exception.
> 
> The problem is that the behavior of the RawConsumer class can change
> during runtime.  This means that it can throw an exception while
> consuming some messages, then later in time it can "recover".  When
> it recovers, I need to be able to retry all of the previously
> unacknowledged messages.
> 
>> Would closing and re-opening the channel be an option?
> 
> I think I can do that.  Are there any pitfalls in this approach.  I
> don't want to lose any messages.

Closing the channel will result in all unacknowledged messages getting 
requeued, so no messages will be lost.

Another option is to cancel the consumer before initiating the recover. 
The sequence of client actions would be something like this:
1) send basic.cancel
2) wait for basic.cancel-ok
3) send basic.recover
4) send basic.consume

The hook for step 2 is provided by overriding the handleCancelOk method 
on the consumer class.

Note that the basic.recover in step 3 can by async or sync - it doesn't 
matter.

While waiting for the basic.cancel-ok in step 2 you have a choice of 
either continuing to process and ack messages, or throw them away and 
let the server resend them to the client as part of the recovery.


Regards,

Matthias.




More information about the rabbitmq-discuss mailing list