[rabbitmq-discuss] RabbitMQ .NET client BasicConsume and HandleBasicDeliver question

Emile Joubert emile at rabbitmq.com
Wed Jun 15 13:42:31 BST 2011


Hi,

Yes, if you want to retrieve a single message synchronously then use
IModel.BasicGet() . BasicConsume() is for asynchronous delivery of
messages, which is faster than BasicGet() and often leads to simpler
client code.



On 15/06/11 13:35, T-zex wrote:
> In my case it doesn't matter if it is IModel.Close() or
> IModel.ChannelFlow(false) couse the process must be terminated anyway.
> We need an atomic operation which would ack the message and would not
> fetch the other one. It seems that BasicConsume is unable to gurantee
> that, so maybe BasicGet is a better option?
> 
> On Wed, Jun 15, 2011 at 12:03 PM, Emile Joubert <emile at rabbitmq.com> wrote:
>> Hi,
>>
>> Prefetch count limits the number of unacknowledged messages, so you
>> would need to acknowledge the last message to get the next one if the
>> prefetch count was set to 1.
>>
>> You should never need to close the channel for flow control. You can use
>> IModel.ChannelFlow() if you need to temporarily stop the broker from
>> delivering messages. This works independently from the prefetch count.
>>
>>
>> -Emile
>>
>>
>> On 15/06/11 10:55, T-zex wrote:
>>> Thank you!
>>>
>>> When prefetch count is set to 1 channel will try to fetch the next
>>> message as soon as HandleBasicDeliver returns? Should I invoke
>>> Channel.Close() on a different thread (to avoid blocking) and then
>>> return?
>>>
>>> On Wed, Jun 15, 2011 at 10:33 AM, Emile Joubert <emile at rabbitmq.com> wrote:
>>>> Hi,
>>>>
>>>> On 15/06/11 10:08, T-zex wrote:
>>>>> Hi,
>>>>>
>>>>> We are overriding DefaultBasicConsumer.HandleBasicDeliver method and
>>>>> use IModel.BasicConsume to subscribe to incoming messages:
>>>>> model.BasicConsume(queue, false, instanceOfDerivedConsumer);
>>>>>
>>>>> When application fails to ack a message that message is requeued. How
>>>>> can I guarantee that BasicConsume is receiving one message at a time?
>>>>> How to deterministically stop consuming when application detects that
>>>>> it is unable to process a message and prevent the second message from
>>>>> arriving? How to make sure that there is one and only one unacked
>>>>> message and that message is at the peak of broker queue.
>>>>
>>>> The solution is to set the prefetch count of the channel to 1 using
>>>> IModel.BasicQos(). Also see
>>>> http://www.rabbitmq.com/amqp-0-9-1-quickref.html#basic.qos .
>>>> Note that rabbit does not implement the prefetch size or global
>>>> parameters to the same method.



More information about the rabbitmq-discuss mailing list