def put_result(self, result_id, data): """Puts a result to the AMQ result queue. :type result_id: str :param result_id: The result id received with get_request :type data: dict :param data: Result to send to the client""" str_result_id = str(result_id) hash_id = cmn.get_hash(str_result_id, self.amq_num_queues) result_queue = self.get_result_queue(index=hash_id) body = { 'result_id': str_result_id, 'data': data, } self.producer.publish( body=body, routing_key=str(hash_id), exchange=self.result_exchange, declare=[result_queue], ) cmn.lg.debug( "Server published result %s within %s" % ( str_result_id, result_queue, ) )
def get_result(self, result_id, timeout=None): """Wait for a result. Blocks unit a result arrives or the timeout has expired. If no result has arrived when timeout is expired get_result raises a EmptyException. :type result_id: string :param result_id: Get the result for this result_id :type timeout: float :param timeout: timeout after which get_result will raise EmptyException() """ if timeout is None: timeout = self.timeout routing_key = str(result_id) hash_id = cmn.get_hash(routing_key, self.amq_num_queues) result_queue = self.get_result_queue(index=hash_id) self.wait_id = routing_key self.consumer.add_queue(result_queue) cmn.lg.debug("Queue %s in queues: %s" % ( result_queue, len(self.consumer.queues) )) self.consumer.consume() cmn.lg.debug( "Client waiting for result for " "request %s on %s during %ss" % ( hash_id, result_queue, timeout ) ) while self.response is None: try: self.amq_connection.drain_events(timeout=timeout) except socket.timeout: cmn.lg.error("Client hit the fan after %ss" % timeout) raise cmn.EmptyException() cmn.lg.debug("Client got %s from AMQ" % result_id) cmn.lg.debug("Client returning %s" % self.response) res = self.response self.response = None return res