0

In the following python programme I am configuring RabbitMq. I am creating an exchange named "order" and publishing 3 messages with routing keys "order.notify","order.report","order.test".

import pika
import json
import uuid

con = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = con.channel()

channel.exchange_declare(
    exchange='order',
    exchange_type = 'direct'
)


channel.basic_publish(
    exchange= 'order',
    routing_key= 'order.notify',
    body= json.dumps({'user_email' : 'First'})
    #body= json.dumps({'user_email' : order['user_email']})
)

print('[x] Sent nortify message')

channel.basic_publish(
    exchange= 'order',
    routing_key= 'order.report',
    body= json.dumps({'user_email' : 'Second'})
)

print('[x] Sent report  message') 



channel.basic_publish(
    exchange= 'order',
    routing_key= 'order.test',
    body= json.dumps({'user_email' : 'third'})
  
)

print('[x] Sent report  message')
 
con.close()

Now at consumer side I have created only 2 queues , with binding keys order.nortiy and order.report

report.py


import pika
import json


con = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = con.channel()

queue = channel.queue_declare('order_notify')
queue_name = queue.method.queue

channel.queue_bind(
    exchange='order',
    queue=queue_name,
    routing_key='order.report' #binding key
)

def callback(ch,method, properties, body):
    payload = json.loads(body)
    # print(' [x] Notifying {}' .format(payload['user_email']))
    print('Report  Queue')
    print(payload['user_email'])
    ch.basic_ack(delivery_tag= method.delivery_tag)

channel.basic_consume(on_message_callback= callback,queue=queue_name)   

print(' [*] waiting for report messages. To exit press CTRL + C')

channel.start_consuming()

nortify.py


import pika
import json


con = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = con.channel()

queue = channel.queue_declare('order_notify')
queue_name = queue.method.queue

channel.queue_bind(
    exchange='order',
    queue=queue_name,
    routing_key='order.notify' #binding key
)

def callback(ch,method, properties, body):
    payload = json.loads(body)
    # print(' [x] Notifying {}' .format(payload['user_email']))
    print('Nortify Queue')
    print(payload['user_email'])
    ch.basic_ack(delivery_tag= method.delivery_tag)

channel.basic_consume(on_message_callback= callback,queue=queue_name)   

print(' [*] waiting for report messages. To exit press CTRL + C')

channel.start_consuming()

Now which queue wil consume which message. I try to run and queues were consuming randomly. Can someone please explain?

Tried to run the above programme but was getting random results.Each queue was consuming different messages when run different times

1 Answers1

0

You have 2 queues:

  1. The queue with the routing key: "order.notify" should get all messgaes that produced with "order.notify" routing key.
  2. The queue with the routing key: "order.report" should get all messgaes that produced with "order.report" routing key.

The last message with the 'order.test' routing key will be lost because no queue consumes it.

ayala
  • 331
  • 1
  • 9