Use Priority Queues
Defining
Priority Queues
You must define a priority queue specifically before you start to
use it. You cannot subsequently change a queue to/from a priority
queue (without deleting it and re-creating).
You define a queue as a priority queue in the virtualhost
configuration file, which the broker loads at startup. When
defining the queue, add a <priority>true</priority>
element. This will ensure that the queue has 10 distinct
priorities, which is the number supported by JMS.
If you require fewer priorities, it is possible to specify a
<priorities>int</priorities> element (where int is a
valid integer value between 2 and 10 inclusive) which will give
the queue that number of distinct priorities. When messages are
sent to that queue, their effective priority will be calculated
by partitioning the priority space. If the number of effective
priorities is 2, then messages with priority 0-4 are treated the
same as "lower priority" and messages with priority 5-9 are
treated equivalently as "higher priority".
<queue>
<name>test</name>
<test>
<exchange>amq.direct</exchange>
<priority>true</priority>
</test>
</queue>
Client configuration/messaging model for priority queues
There are some other configuration & paradigm changes which
are required in order that priority queues work as expected.
Set low pre-fetch
Qpid clients receive buffered messages in batches, sized
according to the pre-fetch value. The current default is 5000.
However, if you use the default value you will probably
not see desirable behaviour with messages of different
priority. This is because a message arriving after the pre-fetch
buffer has filled will not leap frog messages of lower priority.
It will be delivered at the front of the next batch of buffered
messages (if that is appropriate), but this is most likely NOT
what you need.
So, you need to set the prefetch values for your client
(consumer) to make this sensible. To do this set the java system
property max_prefetch on the client environment (using -D) before
creating your consumer.
Setting the Qpid pre-fetch to 1 for your client means that
message priority will be honoured by the Qpid broker as it
dispatches messages to your client. A default for all client
connections can be set via a system property:
-Dmax_prefetch=1
The prefetch can be also be adjusted on a per connection basis by
adding a 'maxprefetch' value to the
amqp://guest:guest@client1/development?maxprefetch='1'&brokerlist='tcp://localhost:5672'
There is a slight performance cost here if using the receive()
method and you could test with a slightly higher pre-fetch (up to
10) if the trade-off between throughput and prioritisation is
weighted towards the former for your application. (If you're
using OnMessage() then this is not a concern.)
Single
consumer per session
If you are using the receive() method to consume messages then
you should also only use one consumer per session with priority
queues. If you're using OnMessage() then this is not a concern.