def call(self, target, msg, timeout=300): self.ensuer_connection() try: result = self.channel.queue_declare(exclusive=True) self.callback_queue = result.queue self.response = None self.corr_id = str(uuid.uuid4()) self.channel.basic_publish(exchange=self.exchange_name, routing_key=str(target), properties=pika.BasicProperties( reply_to=self.callback_queue, correlation_id=self.corr_id, ), body=msg) self.channel.basic_consume(self.on_response, queue=self.callback_queue, no_ack=True) t_start = datetime.now() while self.response is None: if timeout: pika.asyncore_loop(count=1, timeout=timeout) else: pika.asyncore_loop(count=1) t_end = datetime.now() t_spend = (t_end - t_start).seconds logging.debug("Spend %s sec, timeout: %s" % (t_spend, timeout)) if timeout and t_spend >= timeout: raise TimeoutException("RPC Call Timeout") return self.response finally: # A call is finish delete the queue self.channel.queue_delete(queue=self.callback_queue)
def loop(self): while self.connected: pika.asyncore_loop(count=1) # if no socket is available break the loop if utils.num_sockets() <= 0: break self.connected = False if utils.num_sockets() > 0: utils.close_sockets() logging.info("All connection closed!") return
def receive_one(self): self.channel.basic_qos(prefetch_count=1) self.channel.basic_consume(self.__on_receive, queue=self.queue_name) pika.asyncore_loop(count=1)