2424from taskiq .decor import AsyncTaskiqDecoratedTask
2525from taskiq .events import TaskiqEvents
2626from taskiq .exceptions import TaskBrokerMismatchError
27+ from taskiq .flow import Flow
2728from taskiq .formatters .proxy_formatter import ProxyFormatter
2829from taskiq .message import BrokerMessage
2930from taskiq .result_backends .dummy import DummyResultBackend
31+ from taskiq .router import TaskiqRouter
3032from taskiq .serializers .json_serializer import JSONSerializer
3133from taskiq .state import TaskiqState
34+ from taskiq .task_builder import TaskDefinition
3235from taskiq .utils import maybe_awaitable
3336from taskiq .warnings import TaskiqDeprecationWarning
3437
@@ -78,6 +81,10 @@ def __init__(
7881 self ,
7982 result_backend : "AsyncResultBackend[_T] | None" = None ,
8083 task_id_generator : Callable [[], str ] | None = None ,
84+ * ,
85+ router : TaskiqRouter | None = None ,
86+ broker_name : str | None = None ,
87+ default_flow : Flow | None = None ,
8188 ) -> None :
8289 if result_backend is None :
8390 result_backend = DummyResultBackend ()
@@ -103,6 +110,13 @@ def __init__(
103110 self .serializer : TaskiqSerializer = JSONSerializer ()
104111 self .formatter : TaskiqFormatter = ProxyFormatter (self )
105112 self .id_generator = task_id_generator
113+ self .router = router or TaskiqRouter ()
114+ self .default_flow = default_flow
115+ self .broker_name = self .router .set_broker (
116+ self ,
117+ name = broker_name ,
118+ default_flow = default_flow ,
119+ )
106120 self .local_task_registry : dict [str , AsyncTaskiqDecoratedTask [Any , Any ]] = {}
107121 # Every event has a list of handlers.
108122 # Every handler is a function which takes state as a first argument.
@@ -133,10 +147,14 @@ def find_task(self, task_name: str) -> AsyncTaskiqDecoratedTask[Any, Any] | None
133147 :param task_name: name of a task.
134148 :returns: found task or None.
135149 """
136- return self .local_task_registry .get (
137- task_name ,
138- ) or self .global_task_registry .get (
139- task_name ,
150+ return (
151+ self .local_task_registry .get (
152+ task_name ,
153+ )
154+ or self .router .find_task (task_name )
155+ or self .global_task_registry .get (
156+ task_name ,
157+ )
140158 )
141159
142160 def get_all_tasks (self ) -> dict [str , AsyncTaskiqDecoratedTask [Any , Any ]]:
@@ -152,7 +170,11 @@ def get_all_tasks(self) -> dict[str, AsyncTaskiqDecoratedTask[Any, Any]]:
152170
153171 :return: dict of all tasks. Keys are task names, values are tasks.
154172 """
155- return {** self .global_task_registry , ** self .local_task_registry }
173+ return {
174+ ** self .global_task_registry ,
175+ ** self .router .get_all_tasks (),
176+ ** self .local_task_registry ,
177+ }
156178
157179 def add_dependency_context (self , new_ctx : dict [Any , Any ]) -> None :
158180 """
@@ -237,6 +259,23 @@ async def kick(
237259 :param message: name of a task.
238260 """
239261
262+ async def kick_to_flow (
263+ self ,
264+ message : BrokerMessage ,
265+ flow : Flow | None = None ,
266+ ) -> None :
267+ """
268+ Send message to a flow-aware broker.
269+
270+ Existing brokers can keep implementing only `kick`. New brokers may
271+ override this method and use `flow` to route to a concrete queue, topic,
272+ stream or any other transport address.
273+
274+ :param message: message to send.
275+ :param flow: optional transport-neutral flow.
276+ """
277+ await self .kick (message )
278+
240279 @abstractmethod
241280 def listen (self ) -> AsyncGenerator [bytes | AckableMessage , None ]:
242281 """
@@ -362,7 +401,8 @@ def inner(
362401
363402 def register_task (
364403 self ,
365- func : Callable [_FuncParams , _ReturnType ],
404+ func : Callable [_FuncParams , _ReturnType ]
405+ | TaskDefinition [_FuncParams , _ReturnType ],
366406 task_name : str | None = None ,
367407 ** labels : Any ,
368408 ) -> AsyncTaskiqDecoratedTask [_FuncParams , _ReturnType ]:
@@ -380,6 +420,12 @@ def register_task(
380420
381421 :returns: registered task.
382422 """
423+ if isinstance (func , TaskDefinition ):
424+ return self .router .register_task (
425+ func ,
426+ broker = self ,
427+ flow = self .default_flow ,
428+ )
383429 return self .task (task_name = task_name , ** labels )(func )
384430
385431 def on_event (self , * events : TaskiqEvents ) -> Callable [[EventHandler ], EventHandler ]:
@@ -533,6 +579,11 @@ def _register_task(
533579 if task .broker != self :
534580 raise TaskBrokerMismatchError (broker = task .broker )
535581 self .local_task_registry [task_name ] = task
582+ self .router .register_task (
583+ task ,
584+ broker = self ,
585+ flow = self .default_flow ,
586+ )
536587
537588 async def __aenter__ (self ) -> None :
538589 """Starts the broker as ctx manager."""
0 commit comments