Exemple #1
0
    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)