2012/7/12 Gordon Sim <[email protected]>:
> On 07/12/2012 03:36 AM, Zhihua Che wrote:
>>
>> hi,
>>
>>      I got confused with the term of 'capacity' of the sender and
>> receiver.
>
>
> Essentially 'capacity' restricts the number of 'buffered' messages. In the
> case of the sender, this is messages that have been sent but not yet
> confirmed by the broker. In the case of the receiver this is the number of
> messages the broker can pre-emptively send to the client - what is often
> known as 'prefetch', i.e. messages send by the broker before the application
> has actually fetched them, in anticipation of- and in order to speed up-
> subsequent fetches.
>
>
>>      In my app, I create a queue and a sender and a receiver bound with
>> it.
>>      I also set both the capacity of the sender and receiver as 100.
>>      Through qpid-tool, I find that, every time the receiver receives
>> one message from the queue, a field named 'acquires' of the queue is
>> increased by one.
>
>
> Right, that indicates the broker allocating a message to the consumer.
>
>
>>      When the 'acquires' number reaches the 100, my app cannot get
>> message from the queue any more.
>
>
> What do you mean here? Certainly that number should not go up further
> without the receiver calling fetch(), but the receiver should certainly be
> able to fetch() more messages. The capacity 'window' is moved as messages
> sent by the broker are handed off to the application in response to fetch()
> calls.
>

I checked it again.
Here are two process, a sender and a receiver.
This time, I just set the capacity of the receiver by calling
receiver.setCapacity(100)
Then, the sender started sending message and receiver started fetching message.
I watched the queue by qpid-tool and found that.
After the 'acquires' reaches the 100 and stop increasing, the
'msgTotalDequeues' also reaches 100 and stop increasing.
In the meantime, the 'msgTotalEnqueues' still increases.

>>      So, what does the term 'capacity' and the field 'acquires' mean?
>
>
> Hopefully the description of capacity above will make sense. The 'acquires'
> stat in management tracks the number of message 'allocations'. For competing
> consumers, each message is given to only one consumer - the consumer is
> considered to have 'acquired' the message.
>
>
>>      I noticed that, in qpid-tool, another field 'release' which is
>> actually above 'acquires' is always 0, is it right?
>
>
> Yes, unless you either release messages explicitly (through
> Session::release()) or end a session without acknowledging messages, there
> will be no released messages.
>
> Releasing a message is a mechanism for allowing a message acquired by one
> consumer to be returned to the available state and re-acquired (potentially
> by another consumer).
>
>
>>      As for my code, I use c++ client and qpid::messaging api. I send
>> the message using sender.send(msg, true), and fetch message with
>> fetch(msg, Duration::IMMEDIATE), and acknowledge by call
>> session.acknowledge();
>
>
> If sending synchronously (i.e. specifying true for the second parameter to
> send()), the senders capacity is of no real significance as you are blocking
> until that send has completed. (In effect the used capacity will never be
> greater than 1).
>
> If you are finding that you stop being able to fetch() messages even when
> there are some available on the queue, please provide a bit more detail on
> the receiving application, ideally a reproducer.
>
> Hope this helps...
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to