57 lines
1.8 KiB
Python
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
|
|
|