Esempio n. 1
0
    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,
            )
        )
Esempio n. 2
0
    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