Source code for edeposit.amqp.amqp_tool
#! /usr/bin/env python
# -*- coding: utf-8 -*-
#
# Interpreter version: python 2.7
#
#= Imports ====================================================================
"""
Script which simplifies debugging and testing AMQP communication, routing, keys
and so on.
"""
import sys
import uuid
import argparse
import pika
import aleph
import aleph.convertors
import alephdaemon
from settings import *
[docs]def createBlockingConnection():
"""
Return properly created blocking connection.
Uses :func:`edeposit.amqp.alephdaemon.getConnectionParameters`.
"""
return pika.BlockingConnection(alephdaemon.getConnectionParameters())
[docs]def receive():
"""
Print all messages from :attr:`edeposit.amqp.settings`
``RABBITMQ_ALEPH_PLONE_QUEUE``.
"""
for method_frame, properties, body in channel.consume(RABBITMQ_ALEPH_PLONE_QUEUE):
print "Message:"
print method_frame
print properties
print body
print "---"
print
channel.basic_ack(method_frame.delivery_tag)
[docs]def createSchema():
"""
Create the routing schema in rabbitmq's database.
Note:
This is here mainly for testing purposes. Proper schema will require
more routing keys.
"""
exchanges = [
"search",
"count",
"export",
"validate"
]
queues = {
RABBITMQ_ALEPH_PLONE_QUEUE: RABBITMQ_ALEPH_PLONE_KEY,
RABBITMQ_ALEPH_DAEMON_QUEUE: RABBITMQ_ALEPH_DAEMON_KEY
}
connection = createBlockingConnection()
channel = connection.channel()
print "Creating exchanges:"
for exchange in exchanges:
channel.exchange_declare(
exchange=exchange,
exchange_type="topic",
durable=True
)
print "\tCreated exchange '%s' of type 'topic'." % (exchange)
print
print "Creating queues:"
for queue in queues.keys():
channel.queue_declare(
queue=queue,
durable=True,
# arguments={'x-message-ttl': int(1000 * 60 * 60 * 24)} # :S
)
print "\tCreated durable queue '%s'." % (queue)
print
print "Routing exchanges using routing key to queues:"
for exchange in exchanges:
for queue in queues.keys():
channel.queue_bind(
queue=queue,
exchange=exchange,
routing_key=queues[queue]
)
print "\tRouting exchange %s['%s'] -> '%s'." % (exchange, queues[queue], queue)
print "\tRouting exchange search['%s'] -> '%s'." % (RABBITMQ_ALEPH_EXCEPTION_KEY, RABBITMQ_ALEPH_PLONE_QUEUE)
channel.queue_bind(
queue=RABBITMQ_ALEPH_PLONE_QUEUE,
exchange="search",
routing_key=RABBITMQ_ALEPH_EXCEPTION_KEY
)
#= Main program ===============================================================
if __name__ == '__main__':
# parse arguments
parser = argparse.ArgumentParser(description="AMQP debugger.")
parser.add_argument(
'--put',
action='store_true',
help="Put one message into queue %s." % (RABBITMQ_ALEPH_DAEMON_QUEUE)
)
parser.add_argument(
'--put-bad',
action='store_true',
help="Put error message into queue %s." % (RABBITMQ_ALEPH_DAEMON_QUEUE)
)
parser.add_argument(
'--get',
action='store_true',
help="Get one message from queue %s." % (RABBITMQ_ALEPH_DAEMON_QUEUE)
)
parser.add_argument(
'--create',
action='store_true',
help="Create the schema in RabbitMQ."
)
parser.add_argument(
'--timeout',
metavar="N",
type=int,
default=-1,
help="Wait for message only N seconds."
)
args = parser.parse_args()
# variable initialization
isbnq = aleph.ISBNQuery("80-251-0225-4")
request = aleph.SearchRequest(isbnq)
json_data = aleph.convertors.toJSON(request)
connection = createBlockingConnection()
# register timeout
if args.timeout > 0:
connection.add_timeout(
args.timeout,
lambda: sys.stderr.write("Timeouted\n") or sys.exit(1)
)
channel = connection.channel()
properties = pika.BasicProperties(
content_type="application/json",
delivery_mode=1,
headers={"UUID": str(uuid.uuid4())}
)
# react to parameters
if args.create:
createSchema()
if args.put:
channel.basic_publish(
exchange=RABBITMQ_ALEPH_EXCHANGE,
routing_key=RABBITMQ_ALEPH_DAEMON_KEY,
properties=properties,
body=json_data
)
if args.put_bad:
channel.basic_publish(
exchange=RABBITMQ_ALEPH_EXCHANGE,
routing_key=RABBITMQ_ALEPH_DAEMON_KEY,
properties=properties,
body="xex"
)
if args.get:
try:
receive()
except KeyboardInterrupt:
print
sys.exit(0)