81 lines
2.4 KiB
Python
81 lines
2.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
This example demonstrates RabbitMQ's "Direct reply-to" usage via
|
|
`pika.BlockingConnection`. See https://www.rabbitmq.com/direct-reply-to.html
|
|
for more info about this feature.
|
|
"""
|
|
|
|
import pika
|
|
|
|
|
|
SERVER_QUEUE = 'rpc.server.queue'
|
|
|
|
|
|
def main():
|
|
""" Here, Client sends "Marco" to RPC Server, and RPC Server replies with
|
|
"Polo".
|
|
|
|
NOTE Normally, the server would be running separately from the client, but
|
|
in this very simple example both are running in the same thread and sharing
|
|
connection and channel.
|
|
|
|
"""
|
|
with pika.BlockingConnection() as conn:
|
|
channel = conn.channel()
|
|
|
|
# Set up server
|
|
|
|
channel.queue_declare(queue=SERVER_QUEUE,
|
|
exclusive=True,
|
|
auto_delete=True)
|
|
channel.basic_consume(on_server_rx_rpc_request, queue=SERVER_QUEUE)
|
|
|
|
|
|
# Set up client
|
|
|
|
# NOTE Client must create its consumer and publish RPC requests on the
|
|
# same channel to enable the RabbitMQ broker to make the necessary
|
|
# associations.
|
|
#
|
|
# Also, client must create the consumer *before* starting to publish the
|
|
# RPC requests.
|
|
#
|
|
# Client must create its consumer with no_ack=True, because the reply-to
|
|
# queue isn't real.
|
|
|
|
channel.basic_consume(on_client_rx_reply_from_server,
|
|
queue='amq.rabbitmq.reply-to',
|
|
no_ack=True)
|
|
channel.basic_publish(
|
|
exchange='',
|
|
routing_key=SERVER_QUEUE,
|
|
body='Marco',
|
|
properties=pika.BasicProperties(reply_to='amq.rabbitmq.reply-to'))
|
|
|
|
channel.start_consuming()
|
|
|
|
|
|
def on_server_rx_rpc_request(ch, method_frame, properties, body):
|
|
print 'RPC Server got request:', body
|
|
|
|
ch.basic_publish('', routing_key=properties.reply_to, body='Polo')
|
|
|
|
ch.basic_ack(delivery_tag=method_frame.delivery_tag)
|
|
|
|
print 'RPC Server says good bye'
|
|
|
|
|
|
def on_client_rx_reply_from_server(ch, method_frame, properties, body):
|
|
print 'RPC Client got reply:', body
|
|
|
|
# NOTE A real client might want to make additional RPC requests, but in this
|
|
# simple example we're closing the channel after getting our first reply
|
|
# to force control to return from channel.start_consuming()
|
|
print 'RPC Client says bye'
|
|
ch.close()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|