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)