def _on_message(self, handler: type, queue: str, msg: amqpstorm.Message): self._logger.info("Received Message from %s." % queue) payload = msg.body # If the message is of a known Content-Type, decode it automatically. if msg.content_type == "application/json": payload = Message.from_json(msg.body) self._logger.debug("Message Content: %s" % str(payload)) try: self._logger.debug("Dispatching message to %s." % handler.__name__) self._logger.info(self._injector) impl = self._injector.get(handler) assert isinstance(impl, Handler) impl.handle_message(payload) self._logger.info("%s completed without error, ACKing message." % handler.__name__) msg.ack() except RollbackException as e: self._logger.info("%s failed: %s." % (handler.__name__, str(e))) self._logger.info("%s failed, Rolling back..." % handler.__name__) if e.rollback_strategy == RollbackStrategy.NONE: raise elif e.rollback_strategy == RollbackStrategy.RETRY_NOW: msg.nack(requeue=True) elif e.rollback_strategy == RollbackStrategy.RETRY_LATER: msg.reject(requeue=True) elif e.rollback_strategy == RollbackStrategy.QUARANTINE: raise NotImplementedError("RollbackStrategy.QUARANTINE") else: raise Exception("no rollback stragy") except Exception as e: self._logger.info("%s failed: %s." % (handler.__name__, str(e))) msg.reject(requeue=True)