Esempio n. 1
0
    def _process(self):
        while True:
            self._pipe.send('gimme')

            message = self._pipe.recv()

            if isinstance(message, Message):
                try:
                    self._logger.info('Processing charge...')
                    data = msgpack.loads(message.body)

                    pepe = CollectorProcess(
                        logger=self._logger,
                        rabbit_cfg=self._rabbit_cfg,
                        rabbit_sc_cfg=self._rabbit_sc_cfg,
                        dispatch_info=data['dispatch_info'],
                        cco_profile=data['cco_profile'],
                        notification=data.get('notification'),
                        dispatch_content=data.get('dispatch_content')
                    )

                except KeyError, TypeError:
                    self._logger.error('Invalid format')

                else:
                    charge_id = data['cco_profile']['charge_id']
                    try:
                        pepe.cco_charge()

                        if pepe.is_cco_charge_ok():
                            self._logger.info('[%s] Charge OK' % (charge_id))
                            if data.get('notification'):
                                pepe.notify()

                        else:
                            self._logger.info('[%s] Charge FAIL' % (charge_id))
                            if pepe.is_async_fallbackeable():
                                pepe.sct_async_charge()

                        self._logger.info('[%s] Reporting to Snoopy ' \
                            'Charges.' % (charge_id))
                        pepe.report_charge()

                        if pepe.ignore_charge_result():
                            self._logger.info('[%s] Dispatch sended ' \
                                'ignoring charge result.' % (charge_id))
                        else:
                            if pepe.is_dispatch_sendeable():
                                pepe.enable_dispatch_delivery()
                            else:
                                self._logger.info('[%s] Dispatch discarded ' \
                                    'to %s' % (charge_id, pepe.msisdn))

                    except:
                        self._logger.exception('[%s] Reinjecting to queue' % (
                            charge_id))
                        rabbit = RabbitHandler(**self._rabbit_cfg)
                        rabbit.reinject(message)
                        rabbit.disconnect()

                finally:
                    self._logger.info('Done.')