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()