import logging from asyncio import Task from concurrent.futures import Future from typing import TYPE_CHECKING, List from loguru import logger from amqpworker.connections import AMQPConnection from amqpworker.consumer import Consumer from amqpworker.options import RouteTypes from amqpworker.signals.handlers.base import SignalHandler if TYPE_CHECKING: # pragma: no cover from amqpworker.app import App # noqa: F401 class RabbitMQ(SignalHandler): def shutdown(self, app: "App"): logger.debug('shutdown rabbit consumers') if RouteTypes.AMQP_RABBITMQ in app: for consumer in app[RouteTypes.AMQP_RABBITMQ]["consumers"]: logger.debug(f'stop {consumer.host}') consumer.stop() logger.debug(f'stopped {consumer.host}') def startup(self, app: "App") -> List[Future]: tasks = [] app[RouteTypes.AMQP_RABBITMQ]["consumers"] = [] for route_info in app.routes_registry.amqp_routes: conn: AMQPConnection = app.get_connection_for_route(route_info) consumer = Consumer( route_info=route_info, host=conn.hostname, port=conn.port, username=conn.username, password=conn.password, prefetch_count=conn.prefetch, ) app[RouteTypes.AMQP_RABBITMQ]["consumers"].append(consumer) conn.register(consumer.queue) task = app.loop.submit(consumer.start) tasks.append(task) return tasks