@@ -21,18 +21,13 @@ Tasks Page | Task Details Page
21
21
1 ) Add this middleware to your project:
22
22
23
23
``` python
24
- import asyncio
25
- import logging
26
- import aiohttp
27
24
from typing import Any
28
25
from urllib.parse import urljoin
29
26
from datetime import datetime, UTC
30
27
28
+ import httpx
31
29
from taskiq import TaskiqMiddleware, TaskiqResult, TaskiqMessage
32
30
33
- logger = logging.getLogger(__name__ )
34
-
35
-
36
31
class TaskiqAdminMiddleware (TaskiqMiddleware ):
37
32
def __init__ (
38
33
self ,
@@ -44,82 +39,63 @@ class TaskiqAdminMiddleware(TaskiqMiddleware):
44
39
self .url = url
45
40
self .api_token = api_token
46
41
self .__ta_broker_name = taskiq_broker_name
47
- self ._pending: set[asyncio.Task[Any]] = set ()
48
- self ._client: aiohttp.ClientSession | None = None
49
-
50
- @ staticmethod
51
- def _now_iso () -> str :
52
- return datetime.now(UTC ).replace(tzinfo = None ).isoformat()
53
-
54
- async def startup (self ):
55
- self ._client = aiohttp.ClientSession(
56
- timeout = aiohttp.ClientTimeout(total = 5 ),
57
- )
58
-
59
- async def shutdown (self ):
60
- if self ._pending:
61
- await asyncio.gather(* self ._pending, return_exceptions = True )
62
- if self ._client is not None :
63
- await self ._client.close()
64
-
65
- def _spawn_request (self , endpoint : str , payload : dict[str , Any]) -> None :
66
- async def _send () -> None :
67
- session = self ._client or aiohttp.ClientSession(
68
- timeout = aiohttp.ClientTimeout(total = 5 )
69
- )
70
-
71
- async with session.post(
72
- urljoin(self .url, endpoint),
73
- headers = {" access-token" : self .api_token},
74
- json = payload,
75
- ) as resp:
76
- resp.raise_for_status()
77
- if not resp.ok:
78
- logger.error(f " POST { endpoint} - { resp.status} " )
79
-
80
- task = asyncio.create_task(_send())
81
- self ._pending.add(task)
82
- task.add_done_callback(self ._pending.discard)
83
42
84
43
async def post_send (self , message ):
85
- self ._spawn_request(
86
- f " /api/tasks/ { message.task_id} /queued " ,
87
- {
88
- " args" : message.args,
89
- " kwargs" : message.kwargs,
90
- " queuedAt" : self ._now_iso(),
91
- " taskName" : message.task_name,
92
- " worker" : self .__ta_broker_name,
93
- },
94
- )
44
+ now = datetime.now(UTC ).replace(tzinfo = None ).isoformat()
45
+ async with httpx.AsyncClient() as client:
46
+ await client.post(
47
+ headers = {" access-token" : self .api_token},
48
+ url = urljoin(self .url, f " /api/tasks/ { message.task_id} /queued " ),
49
+ json = {
50
+ " args" : message.args,
51
+ " kwargs" : message.kwargs,
52
+ " taskName" : message.task_name,
53
+ " worker" : self .__ta_broker_name,
54
+ " queuedAt" : now,
55
+ },
56
+ )
95
57
return super ().post_send(message)
96
58
97
59
async def pre_execute (self , message : TaskiqMessage):
98
60
""" """
99
-
100
- self ._spawn_request(
101
- f " /api/tasks/ { message.task_id} /started " ,
102
- {
103
- " args" : message.args,
104
- " kwargs" : message.kwargs,
105
- " startedAt" : self ._now_iso(),
106
- " taskName" : message.task_name,
107
- " worker" : self .__ta_broker_name,
108
- },
109
- )
61
+ now = datetime.now(UTC ).replace(tzinfo = None ).isoformat()
62
+ async with httpx.AsyncClient() as client:
63
+ await client.post(
64
+ headers = {" access-token" : self .api_token},
65
+ url = urljoin(self .url, f " /api/tasks/ { message.task_id} /started " ),
66
+ json = {
67
+ " startedAt" : now,
68
+ " args" : message.args,
69
+ " kwargs" : message.kwargs,
70
+ " taskName" : message.task_name,
71
+ " worker" : self .__ta_broker_name,
72
+ },
73
+ )
110
74
return super ().pre_execute(message)
111
75
112
- async def post_execute (self , message : TaskiqMessage, result : TaskiqResult[Any]):
76
+ async def post_execute (
77
+ self ,
78
+ message : TaskiqMessage,
79
+ result : TaskiqResult[Any],
80
+ ):
113
81
""" """
114
- self ._spawn_request(
115
- f " /api/tasks/ { message.task_id} /executed " ,
116
- {
117
- " finishedAt" : self ._now_iso(),
118
- " executionTime" : result.execution_time,
119
- " error" : None if result.error is None else repr (result.error),
120
- " returnValue" : {" return_value" : result.return_value},
121
- },
122
- )
82
+ now = datetime.now(UTC ).replace(tzinfo = None ).isoformat()
83
+ async with httpx.AsyncClient() as client:
84
+ await client.post(
85
+ headers = {" access-token" : self .api_token},
86
+ url = urljoin(
87
+ self .url,
88
+ f " /api/tasks/ { message.task_id} /executed " ,
89
+ ),
90
+ json = {
91
+ " finishedAt" : now,
92
+ " error" : result.error
93
+ if result.error is None
94
+ else repr (result.error),
95
+ " executionTime" : result.execution_time,
96
+ " returnValue" : {" return_value" : result.return_value},
97
+ },
98
+ )
123
99
return super ().post_execute(message, result)
124
100
```
125
101
0 commit comments