Esempio n. 1
0
class QueueManager(ThreadWorker):
    def __init__(self, *args, **kwargs):
        super(QueueManager, self).__init__(*args, **kwargs)
        self._queue = kwargs['queue']
        self._max_queue_gets_per_time = kwargs['max_queue_gets_per_time']
        self._queueman_is_running = kwargs['queueman_is_running']
        self._rabbit_cfg = kwargs['rabbit_cfg']
        self._know_queues = kwargs['know_queues']

        self._rabbit = RabbitHandler(**self._rabbit_cfg)

    def run(self):
        try:
            self._process()
        except:
            self._logger.exception('Thread failure')

    def _process(self):

        while self._is_running.value:
            queues_puts_sum = 0

            for queue in self._know_queues:
                self._logger.info('Processing queue %s' % (queue))

                queue_puts = 0
                for i in range(self._max_queue_gets_per_time):
                    try:
                        data = self._rabbit.get(queue)
                        self._queue.put(queue, data)

                    except Queue.Full:
                        self._rabbit.reject()
                        self._logger.warning('%s Queue full' % (queue))
                        break

                    except RabbitEmpty:
                        self._logger.warning('%s Queue empty' % (queue))
                        break

                    except AMQPConnectionException:
                        self._rabbit.disconnect()

                    except Exception, e:
                        self._logger.exception('Error %s' % (e))
                        self._logger.warning('----------------------------')

                    else:
                        self._rabbit.ack()
                        queue_puts += 1

                queues_puts_sum += queue_puts
                self._logger.info('%d elements puts' % (queue_puts))
                self._logger.info('Switching queue')

            if queues_puts_sum == 0:
                sleep(5)

        self._rabbit.disconnect()
        self._queueman_is_running.clear()
        self._logger.info('Goodbye!')