Exemplo n.º 1
0
class RabbitHelper(object):
    def __init__(self, mq_server = None, virtual_host = cfg.CB_CLUSTER_TAG):

        if mq_server == None:
            mq_server = cfg.RABBITMQ_IP

        self.connection = Connection(host= mq_server, userid="guest", password="******", virtual_host = virtual_host)
        self.manager = Client(mq_server+":55672", "guest", "guest")


    def declare(self, queue = None, durable = True):
        res = None
        channel = self.connection.channel()
        if queue:
            if not isinstance(queue,str): queue = str(queue)
            res = channel.queue_declare(queue = queue, durable = durable, auto_delete = True)
        else:
            # tmp queue
            res = channel.queue_declare(exclusive = True)

        channel.close()
        return res


    def exchange_declare(self, exchange, type_='direct'):
        channel = self.connection.channel()
        channel.exchange_declare(exchange = exchange,
                                type=type_)
        channel.close()

    def bind(self, exchange, queue):
        channel = self.connection.channel()
        channel.queue_bind(exchange = exchange, queue = queue)
        channel.close()

    def delete(self, queue):
        channel = self.connection.channel()
        if not isinstance(queue,str): queue = str(queue)
        channel.queue_delete(queue=queue)
        channel.close()

    def purge(self, queue):
        channel = self.connection.channel()
        if not isinstance(queue,str): queue = str(queue)
        channel.queue_purge(queue=queue)
        channel.close()

    def channel(self):
        return  self.connection.channel(), self.connection


    def qsize(self, queue):
        size = 0
        if queue != None:

            if not isinstance(queue,str): queue = str(queue)

            response = self.declare(queue = queue)
            size = response[1]

        return size

    def broadcastMsg(self, routing_key, body):
        channel = self.connection.channel()
        rc = channel.basic_publish(exchange = '', routing_key = routing_key,  body = body)
        channel.close()

    def getExchange(self, vhost, exchange):
        return self.manager.get_exchange(vhost, exchange)

    def numExchangeQueues(self, vhost, exchange):

        try:
          ex = self.getExchange(vhost, exchange)
          return len(ex['outgoing'])
        except Exception:
          return 1 # todo: sometimes the broker doesn't return expected response


    def putMsg(self, routing_key, body, exchange = ''):

        channel = self.connection.channel()
        if not isinstance(routing_key, str): routing_key= str(routing_key)

        rc = channel.basic_publish(exchange = exchange,
                                   routing_key = routing_key,
                                   body = body)
        channel.close()


    def getMsg(self, queue, no_ack = False, requeue = False):

        channel = self.connection.channel()
        message = channel.basic_get(queue = queue)
        body = None

        if message is not None:
            body = message.body
            # Handle data receipt acknowldegement
            if no_ack == False:
               message.ack()

            if requeue:
                self.putMsg(queue, body)

        channel.close()
        return body

    def getJsonMsg(self, queue, no_ack = False, requeue = False):

        msg = self.getMsg(queue, no_ack, requeue)
        body = {}
        if msg is not None:
            try:
                body = json.loads(msg)
            except ValueError:
                pass

        return body

    def close(self):
        self.connection.close()

    def __del__(self):
        self.close()