Files
FeatureOrientedSkeleton/shared/application/rabbitmq_application.py
2026-07-08 23:01:55 +04:00

57 lines
1.8 KiB
Python

from typing import Callable, Awaitable, override
from asyncio import CancelledError
from logging import Logger
from punq import Container
from aio_pika.abc import AbstractIncomingMessage
from kernel.application.stop_event import StopEvent
from kernel.application.view.configuration import Configuration
from kernel.application.application import Application
from kernel.rabbitmq.client import Client
from shared.application.view.listener_arguments import ListenerArguments
class RabbitMQApplication(Application):
@override
async def do(
self,
callback: Callable[[Container, AbstractIncomingMessage], Awaitable[None]]
) -> None:
rabbitmq = await self.__connect_rabbitmq_client()
arguments = self.get_container().resolve(ListenerArguments)
async def consumer(message: AbstractIncomingMessage) -> None:
await callback(self.get_container(), message)
queue = arguments.queue
exchange = arguments.exchange
routing_key = arguments.routing_key
await rabbitmq.consume(queue, exchange, consumer, routing_key)
logger = self.get_container().resolve(Logger)
logger.info(f"Queue: {queue}")
logger.info(f"Exchange: `{exchange}`")
if routing_key != "":
logger.info(f"Routing key: {routing_key}")
try:
await self.get_container().resolve(StopEvent).wait()
except CancelledError as e:
logger.exception(e)
async def __connect_rabbitmq_client(self) -> Client:
rabbitmq_client = self.get_container().resolve(Client)
stop_event = self.get_container().resolve(StopEvent)
configuration = self.get_container().resolve(Configuration)
await rabbitmq_client\
.connect(stop_event, configuration.rabbitmq().timeout)
return rabbitmq_client