6.7.4. Priority Queue Demonstration
The following program demonstrates the use and behavior of a priority queue.
- Python
#!/usr/bin/python import sys from qpid.messaging import * connection = Connection("localhost:5672") connection.open() try: ssn = connection.session() x = 0 print "\n" while True: print "Create queue with 2 or 10 priority levels?" x = raw_input() if (x == "2") or (x == "10"): break tx = ssn.sender("nonpriority-demo-queue; {create: always, node: {type: 'queue'}}") print "Creating a priority queue with " + x + " priority levels:" address = "priority-demo-queue; {create: always, " address = address + "node:{x-declare: {auto-delete:True, " address = address + "arguments: {'qpid.priorities': " address = address + x + "}}}}" print address txpriority = ssn.sender(address) rx = ssn.receiver('nonpriority-demo-queue') rxpriority = ssn.receiver("priority-demo-queue") rxbrowse = ssn.receiver("priority-demo-queue; {mode: browse}") print "\nPress Enter to continue\n" x = raw_input() print "First message sent:" msg = Message("priority 1") msg.priority = 1 tx.send(msg) txpriority.send(msg) print msg print "Second message sent:" msg = Message('priority 4') msg.priority = 4 tx.send(msg) txpriority.send(msg) print msg print "\nPress Enter to continue\n" x = raw_input() print "BROWSE PRIORITY QUEUE" print "First browse in priority queue:" print rxbrowse.fetch() print "Second browse in priority queue:" print rxbrowse.fetch() print "\nPress Enter to continue\n" x = raw_input() print "ACQUIRE PRIORITY QUEUE" print "First message in priority queue:" print rxpriority.fetch() print "Second message in priority queue:" print rxpriority.fetch() print "\nPress Enter to continue\n" x = raw_input() print "ACQUIRE NON-PRIORITY QUEUE" print "First message in non-priority queue:" print rx.fetch() print "Second message in non-priority queue:" print rx.fetch() ssn.acknowledge() finally: connection.close()
When run, this program allows you to create a priority queue with 2 or 10 priority levels. It then sends two messages to this queue, with priorities 1 and 4. It then demonstrates the behavior of browsing and acquiring from the priority queue, and contrasts this with acquiring from a non-priority queue.
Here is the output when the program is run and a priority queue with 10 distinct priority levels is created:
Create queue with 2 or 10 priority levels? 10 Creating a priority queue with 10 priority levels: priority-demo-queue; {create: always, node:{x-declare: {auto-delete:True, arguments: {'qpid.priorities': 10}}}}
The queue is declared as
auto-delete: True
to allow the program to be run multiple times with different values for qpid.priorities
. If the queue already exists when the sender is created, the value given for qpid.priorities
has no effect. This value only has an effect when the queue is created.
First message sent: Message(priority=1, content='priority 1') Second message sent: Message(priority=4, content='priority 4')
Two messages are sent, one with priority 1 (the lowest priority), and one with priority 4 (a higher priority).
The first examination is of a browsing receiver. Priority queuing has no effect for browsers, only acquiring consumers, so we see our messages in the order they were sent - FIFO First In, First Out:
BROWSE PRIORITY QUEUE First browse in priority queue: Message(priority=1, properties={'x-amqp-0-10.routing-key': u'priority-demo-queue'}, content='priority 1') Second browse in priority queue: Message(priority=4, properties={'x-amqp-0-10.routing-key': u'priority-demo-queue'}, content='priority 4')
However, when we acquire the messages from the priority queue, we see that they are dequeued in order of descending priority - our priority 4 message is delivered before the priority 1 message, even though it was sent later:
ACQUIRE PRIORITY QUEUE First message in priority queue: Message(priority=4, properties={'x-amqp-0-10.routing-key': u'priority-demo-queue'}, content='priority 4') Second message in priority queue: Message(priority=1, properties={'x-amqp-0-10.routing-key': u'priority-demo-queue'}, content='priority 1')
Finally, for contrast, the messages are dequeued from a non-priority queue, where they are delivered in the order they were received by the broker:
ACQUIRE NON-PRIORITY QUEUE First message in non-priority queue: Message(priority=1, properties={'x-amqp-0-10.routing-key': u'nonpriority-demo-queue'}, content='priority 1') Second message in non-priority queue: Message(priority=4, properties={'x-amqp-0-10.routing-key': u'nonpriority-demo-queue'}, content='priority 4')
When the demonstration is run and a priority queue with only 2 distinct levels is select, you will observe that the priority queue delivers the message in the same order they were delivered:
Create queue with 2 or 10 priority levels? 2 Creating a priority queue with 2 priority levels: priority-demo-queue; {create: always, node:{x-declare: {auto-delete:True, arguments: {'qpid.priorities': 2}}}} .... ACQUIRE PRIORITY QUEUE First message in priority queue: Message(priority=1, properties={'x-amqp-0-10.routing-key': u'priority-demo-queue'}, content='priority 1') Second message in priority queue: Message(priority=4, properties={'x-amqp-0-10.routing-key': u'priority-demo-queue'}, content='priority 4')
When a queue has only two distinct priority levels, those levels are the message priority bands 1-5 and 6-10. Since our messages both have priorities in the band 1-5, they are considered to have the same priority, and are delivered based on the order they were received by the broker.