11import asyncio
2+ import sys
23from collections .abc import AsyncGenerator , Callable
34from datetime import timedelta
45from logging import getLogger
78import aiormq
89from aio_pika import DeliveryMode , ExchangeType , Message , connect_robust
910from aio_pika .abc import AbstractChannel , AbstractQueue , AbstractRobustConnection
10- from aiostream import stream
1111from pamqp .common import FieldTable
1212from taskiq import AckableMessage , AsyncBroker , AsyncResultBackend , BrokerMessage
13- from typing_extensions import Self
13+
14+ if sys .version_info >= (3 , 11 ):
15+ from typing import Self
16+ else :
17+ from typing_extensions import Self
1418
1519from taskiq_aio_pika .exceptions import (
1620 ExchangeNotDeclaredError ,
2024)
2125from taskiq_aio_pika .exchange import Exchange
2226from taskiq_aio_pika .queue import Queue
27+ from taskiq_aio_pika .utils import merge_async_iterables
2328
2429_T = TypeVar ("_T" )
2530
@@ -69,25 +74,20 @@ def __init__(
6974 """
7075 Construct a new broker.
7176
72- :param url: url to rabbitmq. If None,
73- the default "amqp://guest:guest@localhost:5672" is used.
77+ :param url: url to rabbitmq. If None, the default "amqp://guest:guest@localhost:5672" is used.
7478 :param result_backend: custom result backend.
7579 :param task_id_generator: custom task_id generator.
7680 :param qos: number of messages that worker can prefetch.
7781 :param loop: specific even loop.
7882 :param exchange: parameters of exchange that used to send messages.
79- :param task_queues: parameters of queues
80- that will be used to get incoming messages.
83+ :param task_queues: parameters of queues that will be used to get incoming messages.
8184 :param dead_letter_queue: parameters of dead-letter queue.
8285 :param delay_queue: parameters of queue for simple delay implementation.
83- :param delayed_message_exchange_plugin: turn on or disable
84- delayed-message-exchange rabbitmq plugin.
85- :param delayed_message_exchange: parameters of exchange
86- that used to send messages with delay.
86+ :param delayed_message_exchange_plugin: turn on or disable delayed-message-exchange rabbitmq plugin.
87+ :param delayed_message_exchange: parameters of exchange that used to send messages with delay.
8788 :param label_for_routing: label name to use for routing key selection.
8889 :param label_for_priority: label name to use for message priority.
89- :param connection_kwargs: additional keyword arguments,
90- for connect_robust method of aio-pika.
90+ :param connection_kwargs: additional keyword arguments, for connect_robust method of aio-pika.
9191 """
9292 super ().__init__ (result_backend , task_id_generator )
9393
@@ -241,10 +241,8 @@ async def _declare_queues(
241241 """
242242 Declare all queues.
243243
244- It's useful since aio-pika have automatic
245- recover mechanism, which works only if
246- the queue, you're going to listen was
247- declared by aio-pika.
244+ It's useful since aio-pika have automatic recover mechanism, which works only if the queue, you're going to
245+ listen was declared by aio-pika.
248246
249247 :param channel: channel to used for declaration.
250248 :return: list of declared queues and their consumer arguments.
@@ -323,8 +321,7 @@ def with_queue(self, queue: Queue) -> Self:
323321 """
324322 Add new queue to the broker.
325323
326- This method should be called before startup,
327- otherwise the new queue won't be declared and bound to exchange.
324+ This method should be called before startup, otherwise the new queue won't be declared and bound to exchange.
328325
329326 :param queue: queue to add.
330327 :return: self.
@@ -346,12 +343,8 @@ async def kick(self, message: BrokerMessage) -> None:
346343 """
347344 Send message to the exchange.
348345
349- This function constructs rmq message
350- and sends it.
351-
352- The message has task_id and task_name and labels
353- in headers. And message's routing key is the same
354- as the task_name.
346+ This function constructs rmq message and sends it. The message has task_id and task_name and labels in headers.
347+ And message's routing key is the same as the task_name.
355348
356349 :raises NoStartupError: if startup wasn't called.
357350 :raises IncorrectRoutingKeyError: if routing key is incorrect.
@@ -420,8 +413,7 @@ async def listen(self) -> AsyncGenerator[AckableMessage, None]:
420413 """
421414 Listen to queue.
422415
423- This function listens to queue and
424- yields every new message.
416+ This function listens to queue and yields every new message.
425417
426418 :raises NoStartupError: if startup wasn't called.
427419 :yields: parsed broker message.
@@ -446,17 +438,14 @@ async def body(
446438 # Suppress errors during iterator cleanup if channel is being closed
447439 logger .info ("Queue iterator closed during shutdown" )
448440
449- combine = stream . merge (
441+ async for message in merge_async_iterables (
450442 * [
451443 body (queue , consumer_args )
452444 for queue , consumer_args in queue_with_consumer_args_list
453445 if not self ._delay_queue or queue .name != self ._delay_queue .name
454446 ],
455- )
456-
457- async with combine .stream () as streamer :
458- async for message in streamer :
459- yield message
447+ ):
448+ yield message
460449
461450 async def shutdown (self ) -> None :
462451 """Close all connections on shutdown."""
0 commit comments