def _on_pika_message(self, channel, method, props, body): log.debug('PikaCient: Message received, delivery tag #%i : %r' % (method.delivery_tag, len(body))) correlation_id = getattr(props, 'correlation_id', None) if correlation_id not in self.callbacks_hash and method.exchange != 'pubsub': if method.exchange != 'DLX': log.info( 'Got result for task "{0}", but no has callback'.format( correlation_id)) return if method.exchange == 'pubsub': cb = None else: cb = self.callbacks_hash.pop(correlation_id) content_type = getattr(props, 'content_type', 'text/plain') if method.exchange == 'DLX': dl = props.headers['x-death'][0] body = ExpirationError("Dead letter received. Reason: {0}".format( dl.get('reason'))) body.reason = dl.get('reason') body.time = dl.get('time') body.expiration = int(dl.get('original-expiration')) / 1000 else: if props.content_encoding == 'gzip': body = zlib.decompress(body) if 'application/json' in content_type: body = json.loads(body) elif 'application/python-pickle' in content_type: body = pickle.loads(body) channel.basic_ack(delivery_tag=method.delivery_tag) if method.exchange == 'pubsub': ch = props.headers.get('x-pubsub-channel-name', None) if ch in self.pubsub: for cb in self.pubsub[ch]: try: cb(body) except Exception as e: log.debug(traceback.format_exc()) log.error("Error in subscribed callback: {0}".format( str(e))) return else: if isinstance(cb, Future): if isinstance(body, Exception): cb.set_exception(body) else: cb.set_result(body) else: out = cb(body, headers=props.headers) return out
def _on_dlx_received(self, channel, method, props, body): correlation_id = getattr(props, 'correlation_id', None) if correlation_id in self.callbacks_hash: cb = self.callbacks_hash.pop(correlation_id) try: dl = props.headers['x-death'][0] body = ExpirationError( "Dead letter received. Reason: {0}".format( dl.get('reason'))) body.reason = dl.get('reason') body.time = dl.get('time') body.expiration = int(dl.get('original-expiration')) / 1000 cb.set_exception(body) finally: channel.basic_ack(delivery_tag=method.delivery_tag) else: log.error("Method callback %s is not found", correlation_id) channel.basic_ack(delivery_tag=method.delivery_tag) return