Skip to content

Commit 0dd745b

Browse files
authored
Add schedule task demo that contains params (#746)
1 parent 6b2402f commit 0dd745b

File tree

6 files changed

+29
-10
lines changed

6 files changed

+29
-10
lines changed

backend/app/task/crud/crud_result.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ async def get_list(self, name: str | None, task_id: str | None) -> Select:
3535
if task_id is not None:
3636
filters['task_id'] = task_id
3737

38-
return await self.select_order('id', **filters)
38+
return await self.select_order('id', 'desc', **filters)
3939

4040
async def delete(self, db: AsyncSession, pks: list[int]) -> int:
4141
"""

backend/app/task/schema/result.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
from datetime import datetime
44
from typing import Any
55

6-
from pydantic import ConfigDict, Field
6+
from pydantic import ConfigDict, Field, field_serializer
77

8+
from backend.app.task import celery_app
89
from backend.common.schema import SchemaBase
910

1011

@@ -36,3 +37,7 @@ class GetTaskResultDetail(TaskResultSchemaBase):
3637
model_config = ConfigDict(from_attributes=True)
3738

3839
id: int = Field(description='任务结果 ID')
40+
41+
@field_serializer('args', 'kwargs', when_used='unless-none')
42+
def serialize_params(self, value: bytes | None, _info) -> Any:
43+
return celery_app.backend.decode(value)

backend/app/task/tasks/beat.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,22 @@
44

55
from backend.app.task.utils.tzcrontab import TzAwareCrontab
66

7+
# 参考:https://docs.celeryq.dev/en/stable/userguide/periodic-tasks.html
78
LOCAL_BEAT_SCHEDULE = {
89
'测试同步任务': {
910
'task': 'task_demo',
10-
'schedule': schedule(5),
11+
'schedule': schedule(30),
1112
},
1213
'测试异步任务': {
1314
'task': 'task_demo_async',
1415
'schedule': TzAwareCrontab('1'),
1516
},
17+
'测试传参任务': {
18+
'task': 'task_demo_params',
19+
'schedule': TzAwareCrontab('1'),
20+
'args': ['你好,'],
21+
'kwargs': {'b': '世界'},
22+
},
1623
'清理操作日志': {
1724
'task': 'backend.app.task.tasks.db_log.tasks.delete_db_opera_log',
1825
'schedule': TzAwareCrontab('0', '0', day_of_week='6'),

backend/app/task/tasks/db_log/tasks.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
#!/usr/bin/env python3
22
# -*- coding: utf-8 -*-
3+
from celery import shared_task
4+
35
from backend.app.admin.service.login_log_service import login_log_service
46
from backend.app.admin.service.opera_log_service import opera_log_service
5-
from backend.app.task.celery import celery_app
67

78

8-
@celery_app.task
9+
@shared_task
910
async def delete_db_opera_log() -> str:
1011
"""自动删除数据库操作日志"""
1112
await opera_log_service.delete_all()
1213
return 'Success'
1314

1415

15-
@celery_app.task
16+
@shared_task
1617
async def delete_db_login_log() -> str:
1718
"""自动删除数据库登录日志"""
1819
await login_log_service.delete_all()

backend/app/task/tasks/tasks.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,18 @@
1010
@celery_app.task(name='task_demo')
1111
def task_demo() -> str:
1212
"""示例任务,模拟耗时操作"""
13-
sleep(20)
13+
sleep(30)
1414
return 'test async'
1515

1616

1717
@celery_app.task(name='task_demo_async')
1818
async def task_demo_async() -> str:
1919
"""异步示例任务,模拟耗时操作"""
20-
await asleep(20)
20+
await asleep(30)
2121
return 'test async'
22+
23+
24+
@celery_app.task(name='task_demo_params')
25+
async def task_demo_params(hello: str, world: str | None = None) -> str:
26+
"""参数示例任务,模拟传参操作"""
27+
return hello + world

backend/app/task/utils/schedulers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -258,8 +258,8 @@ async def _unpack_fields(
258258
except KeyError:
259259
continue
260260
model_dict.update(
261-
args=json.dumps(args) if args else None,
262-
kwargs=json.dumps(kwargs) if kwargs else None,
261+
args=json.dumps(args, ensure_ascii=False) if args else None,
262+
kwargs=json.dumps(kwargs, ensure_ascii=False) if kwargs else None,
263263
**cls._unpack_options(**options or {}),
264264
**entry,
265265
)

0 commit comments

Comments
 (0)