jettask 0.2.15__py3-none-any.whl → 0.2.17__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- jettask/__init__.py +14 -35
- jettask/{webui/__main__.py → __main__.py} +4 -4
- jettask/api/__init__.py +103 -0
- jettask/api/v1/__init__.py +29 -0
- jettask/api/v1/alerts.py +226 -0
- jettask/api/v1/analytics.py +323 -0
- jettask/api/v1/namespaces.py +134 -0
- jettask/api/v1/overview.py +136 -0
- jettask/api/v1/queues.py +530 -0
- jettask/api/v1/scheduled.py +420 -0
- jettask/api/v1/settings.py +44 -0
- jettask/{webui/api.py → api.py} +4 -46
- jettask/{webui/backend → backend}/main.py +21 -109
- jettask/{webui/backend → backend}/main_unified.py +1 -1
- jettask/{webui/backend → backend}/namespace_api_old.py +3 -30
- jettask/{webui/backend → backend}/namespace_data_access.py +2 -1
- jettask/{webui/backend → backend}/unified_api_router.py +14 -74
- jettask/{core/cli.py → cli.py} +106 -26
- jettask/config/nacos_config.py +386 -0
- jettask/core/app.py +8 -100
- jettask/core/db_manager.py +515 -0
- jettask/core/event_pool.py +5 -2
- jettask/core/unified_manager_base.py +59 -14
- jettask/{webui/db_init.py → db_init.py} +1 -1
- jettask/executors/asyncio.py +2 -2
- jettask/{webui/integrated_gradio_app.py → integrated_gradio_app.py} +1 -1
- jettask/{webui/multi_namespace_consumer.py → multi_namespace_consumer.py} +5 -2
- jettask/{webui/pg_consumer.py → pg_consumer.py} +137 -69
- jettask/{webui/run.py → run.py} +1 -1
- jettask/{webui/run_webui.py → run_webui.py} +4 -4
- jettask/scheduler/manager.py +6 -0
- jettask/scheduler/multi_namespace_scheduler.py +2 -2
- jettask/scheduler/unified_manager.py +5 -5
- jettask/scheduler/unified_scheduler_manager.py +20 -12
- jettask/schemas/__init__.py +166 -0
- jettask/schemas/alert.py +99 -0
- jettask/schemas/backlog.py +122 -0
- jettask/schemas/common.py +139 -0
- jettask/schemas/monitoring.py +181 -0
- jettask/schemas/namespace.py +168 -0
- jettask/schemas/queue.py +83 -0
- jettask/schemas/scheduled_task.py +128 -0
- jettask/schemas/task.py +70 -0
- jettask/services/__init__.py +24 -0
- jettask/services/alert_service.py +454 -0
- jettask/services/analytics_service.py +46 -0
- jettask/services/overview_service.py +978 -0
- jettask/services/queue_service.py +711 -0
- jettask/services/redis_monitor_service.py +151 -0
- jettask/services/scheduled_task_service.py +207 -0
- jettask/services/settings_service.py +758 -0
- jettask/services/task_service.py +157 -0
- jettask/{webui/task_center.py → task_center.py} +30 -8
- jettask/{webui/task_center_client.py → task_center_client.py} +1 -1
- jettask/{webui/config.py → webui_config.py} +6 -1
- jettask/webui_exceptions.py +67 -0
- jettask/webui_sql/verify_database.sql +72 -0
- {jettask-0.2.15.dist-info → jettask-0.2.17.dist-info}/METADATA +2 -1
- jettask-0.2.17.dist-info/RECORD +150 -0
- {jettask-0.2.15.dist-info → jettask-0.2.17.dist-info}/entry_points.txt +1 -1
- jettask/webui/backend/data_api.py +0 -3294
- jettask/webui/backend/namespace_api.py +0 -295
- jettask/webui/backend/queue_backlog_api.py +0 -727
- jettask/webui/backend/redis_monitor_api.py +0 -476
- jettask/webui/frontend/index.html +0 -13
- jettask/webui/frontend/package.json +0 -30
- jettask/webui/frontend/src/App.css +0 -109
- jettask/webui/frontend/src/App.jsx +0 -66
- jettask/webui/frontend/src/components/NamespaceSelector.jsx +0 -166
- jettask/webui/frontend/src/components/QueueBacklogChart.jsx +0 -298
- jettask/webui/frontend/src/components/QueueBacklogTrend.jsx +0 -638
- jettask/webui/frontend/src/components/QueueDetailsTable.css +0 -65
- jettask/webui/frontend/src/components/QueueDetailsTable.jsx +0 -487
- jettask/webui/frontend/src/components/QueueDetailsTableV2.jsx +0 -465
- jettask/webui/frontend/src/components/ScheduledTaskFilter.jsx +0 -423
- jettask/webui/frontend/src/components/TaskFilter.jsx +0 -425
- jettask/webui/frontend/src/components/TimeRangeSelector.css +0 -21
- jettask/webui/frontend/src/components/TimeRangeSelector.jsx +0 -160
- jettask/webui/frontend/src/components/charts/QueueChart.jsx +0 -111
- jettask/webui/frontend/src/components/charts/QueueTrendChart.jsx +0 -115
- jettask/webui/frontend/src/components/charts/WorkerChart.jsx +0 -40
- jettask/webui/frontend/src/components/common/StatsCard.jsx +0 -18
- jettask/webui/frontend/src/components/layout/AppLayout.css +0 -95
- jettask/webui/frontend/src/components/layout/AppLayout.jsx +0 -49
- jettask/webui/frontend/src/components/layout/Header.css +0 -106
- jettask/webui/frontend/src/components/layout/Header.jsx +0 -106
- jettask/webui/frontend/src/components/layout/SideMenu.css +0 -137
- jettask/webui/frontend/src/components/layout/SideMenu.jsx +0 -209
- jettask/webui/frontend/src/components/layout/TabsNav.css +0 -244
- jettask/webui/frontend/src/components/layout/TabsNav.jsx +0 -206
- jettask/webui/frontend/src/components/layout/UserInfo.css +0 -197
- jettask/webui/frontend/src/components/layout/UserInfo.jsx +0 -197
- jettask/webui/frontend/src/contexts/LoadingContext.jsx +0 -27
- jettask/webui/frontend/src/contexts/NamespaceContext.jsx +0 -72
- jettask/webui/frontend/src/contexts/TabsContext.backup.jsx +0 -245
- jettask/webui/frontend/src/index.css +0 -114
- jettask/webui/frontend/src/main.jsx +0 -22
- jettask/webui/frontend/src/pages/Alerts.jsx +0 -684
- jettask/webui/frontend/src/pages/Dashboard/index.css +0 -35
- jettask/webui/frontend/src/pages/Dashboard/index.jsx +0 -281
- jettask/webui/frontend/src/pages/Dashboard.jsx +0 -1330
- jettask/webui/frontend/src/pages/QueueDetail.jsx +0 -1117
- jettask/webui/frontend/src/pages/QueueMonitor.jsx +0 -527
- jettask/webui/frontend/src/pages/Queues.jsx +0 -12
- jettask/webui/frontend/src/pages/ScheduledTasks.jsx +0 -810
- jettask/webui/frontend/src/pages/Settings.jsx +0 -801
- jettask/webui/frontend/src/pages/Workers.jsx +0 -12
- jettask/webui/frontend/src/services/api.js +0 -159
- jettask/webui/frontend/src/services/queueTrend.js +0 -166
- jettask/webui/frontend/src/utils/suppressWarnings.js +0 -22
- jettask/webui/frontend/src/utils/userPreferences.js +0 -154
- jettask/webui/frontend/vite.config.js +0 -26
- jettask/webui/sql/init_database.sql +0 -640
- jettask-0.2.15.dist-info/RECORD +0 -172
- /jettask/{webui/backend → backend}/__init__.py +0 -0
- /jettask/{webui/backend → backend}/api/__init__.py +0 -0
- /jettask/{webui/backend → backend}/api/v1/__init__.py +0 -0
- /jettask/{webui/backend → backend}/api/v1/monitoring.py +0 -0
- /jettask/{webui/backend → backend}/api/v1/namespaces.py +0 -0
- /jettask/{webui/backend → backend}/api/v1/queues.py +0 -0
- /jettask/{webui/backend → backend}/api/v1/tasks.py +0 -0
- /jettask/{webui/backend → backend}/config.py +0 -0
- /jettask/{webui/backend → backend}/core/__init__.py +0 -0
- /jettask/{webui/backend → backend}/core/cache.py +0 -0
- /jettask/{webui/backend → backend}/core/database.py +0 -0
- /jettask/{webui/backend → backend}/core/exceptions.py +0 -0
- /jettask/{webui/backend → backend}/data_access.py +0 -0
- /jettask/{webui/backend → backend}/dependencies.py +0 -0
- /jettask/{webui/backend → backend}/init_meta_db.py +0 -0
- /jettask/{webui/backend → backend}/main_v2.py +0 -0
- /jettask/{webui/backend → backend}/models/__init__.py +0 -0
- /jettask/{webui/backend → backend}/models/requests.py +0 -0
- /jettask/{webui/backend → backend}/models/responses.py +0 -0
- /jettask/{webui/backend → backend}/queue_stats_v2.py +0 -0
- /jettask/{webui/backend → backend}/services/__init__.py +0 -0
- /jettask/{webui/backend → backend}/start.py +0 -0
- /jettask/{webui/cleanup_deprecated_tables.sql → cleanup_deprecated_tables.sql} +0 -0
- /jettask/{webui/gradio_app.py → gradio_app.py} +0 -0
- /jettask/{webui/__init__.py → main.py} +0 -0
- /jettask/{webui/models.py → models.py} +0 -0
- /jettask/{webui/run_monitor.py → run_monitor.py} +0 -0
- /jettask/{webui/schema.sql → schema.sql} +0 -0
- /jettask/{webui/unified_consumer_manager.py → unified_consumer_manager.py} +0 -0
- /jettask/{webui/models → webui_models}/__init__.py +0 -0
- /jettask/{webui/models → webui_models}/namespace.py +0 -0
- /jettask/{webui/sql → webui_sql}/batch_upsert_functions.sql +0 -0
- {jettask-0.2.15.dist-info → jettask-0.2.17.dist-info}/WHEEL +0 -0
- {jettask-0.2.15.dist-info → jettask-0.2.17.dist-info}/licenses/LICENSE +0 -0
- {jettask-0.2.15.dist-info → jettask-0.2.17.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"""
|
|
2
|
+
任务服务层
|
|
3
|
+
处理任务相关的业务逻辑
|
|
4
|
+
"""
|
|
5
|
+
from typing import Optional, List, Dict, Any
|
|
6
|
+
from datetime import datetime, timedelta, timezone
|
|
7
|
+
import logging
|
|
8
|
+
|
|
9
|
+
logger = logging.getLogger(__name__)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class TaskService:
|
|
13
|
+
"""任务服务类"""
|
|
14
|
+
|
|
15
|
+
def __init__(self, data_access):
|
|
16
|
+
"""
|
|
17
|
+
初始化任务服务
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
data_access: 数据访问层实例
|
|
21
|
+
"""
|
|
22
|
+
self.data_access = data_access
|
|
23
|
+
|
|
24
|
+
async def get_tasks_with_filters(
|
|
25
|
+
self,
|
|
26
|
+
queue_name: str,
|
|
27
|
+
page: int = 1,
|
|
28
|
+
page_size: int = 20,
|
|
29
|
+
filters: Optional[List[Dict]] = None,
|
|
30
|
+
time_range: Optional[str] = None,
|
|
31
|
+
start_time: Optional[datetime] = None,
|
|
32
|
+
end_time: Optional[datetime] = None
|
|
33
|
+
) -> Dict[str, Any]:
|
|
34
|
+
"""
|
|
35
|
+
获取任务列表(支持灵活筛选和时间范围)
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
queue_name: 队列名称
|
|
39
|
+
page: 页码
|
|
40
|
+
page_size: 每页大小
|
|
41
|
+
filters: 筛选条件
|
|
42
|
+
time_range: 时间范围字符串
|
|
43
|
+
start_time: 开始时间
|
|
44
|
+
end_time: 结束时间
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
任务列表结果
|
|
48
|
+
"""
|
|
49
|
+
# 处理时间范围
|
|
50
|
+
if not start_time or not end_time:
|
|
51
|
+
if time_range:
|
|
52
|
+
start_time, end_time = await self._calculate_time_range(
|
|
53
|
+
time_range, queue_name
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
# 转换时间格式
|
|
57
|
+
if start_time and isinstance(start_time, str):
|
|
58
|
+
start_time = datetime.fromisoformat(start_time.replace('Z', '+00:00'))
|
|
59
|
+
if end_time and isinstance(end_time, str):
|
|
60
|
+
end_time = datetime.fromisoformat(end_time.replace('Z', '+00:00'))
|
|
61
|
+
|
|
62
|
+
logger.info(
|
|
63
|
+
f"获取队列 {queue_name} 的任务列表, "
|
|
64
|
+
f"页码: {page}, 每页: {page_size}, "
|
|
65
|
+
f"筛选条件: {filters}, "
|
|
66
|
+
f"时间范围: {start_time} - {end_time}"
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
# 调用数据访问层
|
|
70
|
+
return await self.data_access.fetch_tasks_with_filters(
|
|
71
|
+
queue_name=queue_name,
|
|
72
|
+
page=page,
|
|
73
|
+
page_size=page_size,
|
|
74
|
+
filters=filters or [],
|
|
75
|
+
start_time=start_time,
|
|
76
|
+
end_time=end_time
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
async def get_task_details(
|
|
80
|
+
self,
|
|
81
|
+
task_id: str,
|
|
82
|
+
consumer_group: Optional[str] = None
|
|
83
|
+
) -> Dict[str, Any]:
|
|
84
|
+
"""
|
|
85
|
+
获取任务详细信息
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
task_id: 任务ID
|
|
89
|
+
consumer_group: 消费者组名称(可选)
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
任务详细信息
|
|
93
|
+
|
|
94
|
+
Raises:
|
|
95
|
+
ValueError: 当任务不存在时
|
|
96
|
+
"""
|
|
97
|
+
logger.info(
|
|
98
|
+
f"获取任务 {task_id} 的详细数据, "
|
|
99
|
+
f"consumer_group={consumer_group}"
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
task_details = await self.data_access.fetch_task_details(
|
|
103
|
+
task_id, consumer_group
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
if not task_details:
|
|
107
|
+
raise ValueError(f"Task {task_id} not found")
|
|
108
|
+
|
|
109
|
+
return task_details
|
|
110
|
+
|
|
111
|
+
async def _calculate_time_range(
|
|
112
|
+
self,
|
|
113
|
+
time_range: str,
|
|
114
|
+
queue_name: str
|
|
115
|
+
) -> tuple[datetime, datetime]:
|
|
116
|
+
"""
|
|
117
|
+
计算时间范围
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
time_range: 时间范围字符串 (如 "15m", "1h", "7d")
|
|
121
|
+
queue_name: 队列名称
|
|
122
|
+
|
|
123
|
+
Returns:
|
|
124
|
+
(开始时间, 结束时间) 元组
|
|
125
|
+
"""
|
|
126
|
+
now = datetime.now(timezone.utc)
|
|
127
|
+
|
|
128
|
+
time_range_map = {
|
|
129
|
+
"15m": timedelta(minutes=15),
|
|
130
|
+
"30m": timedelta(minutes=30),
|
|
131
|
+
"1h": timedelta(hours=1),
|
|
132
|
+
"3h": timedelta(hours=3),
|
|
133
|
+
"6h": timedelta(hours=6),
|
|
134
|
+
"12h": timedelta(hours=12),
|
|
135
|
+
"24h": timedelta(hours=24),
|
|
136
|
+
"7d": timedelta(days=7),
|
|
137
|
+
"30d": timedelta(days=30),
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
delta = time_range_map.get(time_range, timedelta(minutes=15))
|
|
141
|
+
|
|
142
|
+
# 获取队列的最新任务时间
|
|
143
|
+
latest_time = await self.data_access.get_latest_task_time(queue_name)
|
|
144
|
+
if latest_time:
|
|
145
|
+
# 使用最新任务时间作为结束时间
|
|
146
|
+
end_time = latest_time.replace(second=59, microsecond=999999)
|
|
147
|
+
logger.info(f"使用最新任务时间: {latest_time}")
|
|
148
|
+
else:
|
|
149
|
+
# 如果没有任务,使用当前时间
|
|
150
|
+
end_time = now.replace(second=0, microsecond=0)
|
|
151
|
+
|
|
152
|
+
start_time = end_time - delta
|
|
153
|
+
logger.info(
|
|
154
|
+
f"使用时间范围 {time_range}: {start_time} 到 {end_time}"
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
return start_time, end_time
|
|
@@ -17,7 +17,7 @@ class TaskCenter:
|
|
|
17
17
|
初始化任务中心客户端
|
|
18
18
|
|
|
19
19
|
Args:
|
|
20
|
-
namespace_url: 命名空间的URL,如 http://localhost:8001/api/namespaces/{name}
|
|
20
|
+
namespace_url: 命名空间的URL,如 http://localhost:8001/api/v1/namespaces/{name}
|
|
21
21
|
"""
|
|
22
22
|
self.namespace_url = namespace_url
|
|
23
23
|
self._session: Optional[aiohttp.ClientSession] = None
|
|
@@ -33,8 +33,8 @@ class TaskCenter:
|
|
|
33
33
|
"""解析URL获取命名空间名称"""
|
|
34
34
|
if url.startswith("http://") or url.startswith("https://"):
|
|
35
35
|
import re
|
|
36
|
-
# 匹配格式: /api/namespaces/{name}
|
|
37
|
-
match = re.search(r'/namespaces/([^/]+)$', url)
|
|
36
|
+
# 匹配格式: /api/v1/namespaces/{name}
|
|
37
|
+
match = re.search(r'/api/v1/namespaces/([^/]+)$', url)
|
|
38
38
|
if match:
|
|
39
39
|
self._namespace_name = match.group(1)
|
|
40
40
|
elif url.startswith("taskcenter://"):
|
|
@@ -43,7 +43,7 @@ class TaskCenter:
|
|
|
43
43
|
if len(parts) >= 2 and parts[0] == "namespace":
|
|
44
44
|
self._namespace_name = parts[1]
|
|
45
45
|
base_url = os.getenv("TASK_CENTER_BASE_URL", "http://localhost:8001")
|
|
46
|
-
self.namespace_url = f"{base_url}/api/namespaces/{self._namespace_name}"
|
|
46
|
+
self.namespace_url = f"{base_url}/api/v1/namespaces/{self._namespace_name}"
|
|
47
47
|
|
|
48
48
|
@property
|
|
49
49
|
def is_enabled(self) -> bool:
|
|
@@ -111,9 +111,20 @@ class TaskCenter:
|
|
|
111
111
|
if response.status_code == 200:
|
|
112
112
|
data = response.json()
|
|
113
113
|
self._namespace_name = data.get('name')
|
|
114
|
+
|
|
115
|
+
# 构建redis_config
|
|
116
|
+
redis_config = None
|
|
117
|
+
if data.get('redis_url'):
|
|
118
|
+
redis_config = {'url': data['redis_url']}
|
|
119
|
+
|
|
120
|
+
# 构建pg_config
|
|
121
|
+
pg_config = None
|
|
122
|
+
if data.get('pg_url'):
|
|
123
|
+
pg_config = {'url': data['pg_url']}
|
|
124
|
+
|
|
114
125
|
self._config = {
|
|
115
|
-
'redis_config':
|
|
116
|
-
'pg_config':
|
|
126
|
+
'redis_config': redis_config,
|
|
127
|
+
'pg_config': pg_config,
|
|
117
128
|
'namespace_name': data.get('name'),
|
|
118
129
|
'version': data.get('version', 1)
|
|
119
130
|
}
|
|
@@ -142,9 +153,20 @@ class TaskCenter:
|
|
|
142
153
|
if resp.status == 200:
|
|
143
154
|
data = await resp.json()
|
|
144
155
|
self._namespace_name = data.get('name')
|
|
156
|
+
|
|
157
|
+
# 构建redis_config
|
|
158
|
+
redis_config = None
|
|
159
|
+
if data.get('redis_url'):
|
|
160
|
+
redis_config = {'url': data['redis_url']}
|
|
161
|
+
|
|
162
|
+
# 构建pg_config
|
|
163
|
+
pg_config = None
|
|
164
|
+
if data.get('pg_url'):
|
|
165
|
+
pg_config = {'url': data['pg_url']}
|
|
166
|
+
|
|
145
167
|
self._config = {
|
|
146
|
-
'redis_config':
|
|
147
|
-
'pg_config':
|
|
168
|
+
'redis_config': redis_config,
|
|
169
|
+
'pg_config': pg_config,
|
|
148
170
|
'namespace_name': data.get('name'),
|
|
149
171
|
'version': data.get('version', 1)
|
|
150
172
|
}
|
|
@@ -47,7 +47,7 @@ class TaskCenterClient:
|
|
|
47
47
|
# 旧格式使用的是ID,转换为按名称查找
|
|
48
48
|
self._namespace_name = parts[1] # 假设传入的也是名称
|
|
49
49
|
base_url = os.getenv("TASK_CENTER_BASE_URL", "http://localhost:8001")
|
|
50
|
-
self._config_url = f"{base_url}/api/namespaces/{self._namespace_name}"
|
|
50
|
+
self._config_url = f"{base_url}/api/v1/namespaces/{self._namespace_name}"
|
|
51
51
|
|
|
52
52
|
@property
|
|
53
53
|
def is_enabled(self) -> bool:
|
|
@@ -30,13 +30,18 @@ class PostgreSQLConfig:
|
|
|
30
30
|
"""
|
|
31
31
|
from urllib.parse import urlparse
|
|
32
32
|
|
|
33
|
+
# 清理URL前缀(支持postgresql+asyncpg://)
|
|
34
|
+
if url.startswith('postgresql+asyncpg://'):
|
|
35
|
+
url = url.replace('postgresql+asyncpg://', 'postgresql://')
|
|
36
|
+
|
|
33
37
|
parsed = urlparse(url)
|
|
38
|
+
|
|
34
39
|
return cls(
|
|
35
40
|
host=parsed.hostname or "localhost",
|
|
36
41
|
port=parsed.port or 5432,
|
|
37
42
|
database=parsed.path.lstrip("/") if parsed.path else "jettask",
|
|
38
43
|
user=parsed.username or "jettask",
|
|
39
|
-
password=parsed.password or "
|
|
44
|
+
password=parsed.password or "" # 如果没有密码返回空字符串
|
|
40
45
|
)
|
|
41
46
|
|
|
42
47
|
@property
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"""
|
|
2
|
+
JetTask 异常定义
|
|
3
|
+
"""
|
|
4
|
+
import sys
|
|
5
|
+
import traceback as tb
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class JetTaskException(Exception):
|
|
9
|
+
"""JetTask 基础异常类"""
|
|
10
|
+
pass
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class TaskTimeoutError(JetTaskException):
|
|
14
|
+
"""任务等待超时异常"""
|
|
15
|
+
pass
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class TaskExecutionError(JetTaskException):
|
|
19
|
+
"""任务执行错误异常
|
|
20
|
+
|
|
21
|
+
这个异常会直接打印错误信息并退出,避免显示框架层堆栈
|
|
22
|
+
"""
|
|
23
|
+
def __init__(self, task_id, error_traceback):
|
|
24
|
+
self.task_id = task_id
|
|
25
|
+
self.error_traceback = error_traceback
|
|
26
|
+
# 存储简单的消息用于日志等场景
|
|
27
|
+
super().__init__(f"Task {task_id} failed")
|
|
28
|
+
|
|
29
|
+
def print_and_exit(self, exit_code=1):
|
|
30
|
+
"""打印错误信息并退出程序"""
|
|
31
|
+
print(f"\n任务执行失败 (Task ID: {self.task_id}):", file=sys.stderr)
|
|
32
|
+
print("-" * 60, file=sys.stderr)
|
|
33
|
+
if self.error_traceback and self.error_traceback != "Task execution failed":
|
|
34
|
+
print(self.error_traceback, file=sys.stderr)
|
|
35
|
+
else:
|
|
36
|
+
print("Task execution failed (no detailed error information available)", file=sys.stderr)
|
|
37
|
+
print("-" * 60, file=sys.stderr)
|
|
38
|
+
sys.exit(exit_code)
|
|
39
|
+
|
|
40
|
+
def __str__(self):
|
|
41
|
+
"""返回异常消息"""
|
|
42
|
+
return f"Task {self.task_id} failed:\n{self.error_traceback}"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class TaskNotFoundError(JetTaskException):
|
|
46
|
+
"""任务未找到异常"""
|
|
47
|
+
pass
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class RetryableError(JetTaskException):
|
|
51
|
+
"""
|
|
52
|
+
可重试的错误
|
|
53
|
+
|
|
54
|
+
使用这个异常可以指定建议的重试延迟时间
|
|
55
|
+
|
|
56
|
+
Example:
|
|
57
|
+
raise RetryableError("Service temporarily unavailable", retry_after=30)
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
def __init__(self, message: str, retry_after: float = None):
|
|
61
|
+
"""
|
|
62
|
+
Args:
|
|
63
|
+
message: 错误消息
|
|
64
|
+
retry_after: 建议的重试延迟时间(秒),如果不指定则使用默认的重试策略
|
|
65
|
+
"""
|
|
66
|
+
super().__init__(message)
|
|
67
|
+
self.retry_after = retry_after
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
-- JetTask 数据库结构验证脚本
|
|
2
|
+
-- 用于验证数据库表结构是否正确
|
|
3
|
+
|
|
4
|
+
-- 检查所有表是否存在
|
|
5
|
+
SELECT
|
|
6
|
+
'namespaces' as table_name,
|
|
7
|
+
EXISTS(SELECT 1 FROM information_schema.tables WHERE table_name = 'namespaces') as exists
|
|
8
|
+
UNION ALL
|
|
9
|
+
SELECT
|
|
10
|
+
'scheduled_tasks' as table_name,
|
|
11
|
+
EXISTS(SELECT 1 FROM information_schema.tables WHERE table_name = 'scheduled_tasks') as exists
|
|
12
|
+
UNION ALL
|
|
13
|
+
SELECT
|
|
14
|
+
'tasks' as table_name,
|
|
15
|
+
EXISTS(SELECT 1 FROM information_schema.tables WHERE table_name = 'tasks') as exists
|
|
16
|
+
UNION ALL
|
|
17
|
+
SELECT
|
|
18
|
+
'task_runs' as table_name,
|
|
19
|
+
EXISTS(SELECT 1 FROM information_schema.tables WHERE table_name = 'task_runs') as exists
|
|
20
|
+
UNION ALL
|
|
21
|
+
SELECT
|
|
22
|
+
'stream_backlog_monitor' as table_name,
|
|
23
|
+
EXISTS(SELECT 1 FROM information_schema.tables WHERE table_name = 'stream_backlog_monitor') as exists
|
|
24
|
+
UNION ALL
|
|
25
|
+
SELECT
|
|
26
|
+
'alert_rules' as table_name,
|
|
27
|
+
EXISTS(SELECT 1 FROM information_schema.tables WHERE table_name = 'alert_rules') as exists
|
|
28
|
+
UNION ALL
|
|
29
|
+
SELECT
|
|
30
|
+
'alert_history' as table_name,
|
|
31
|
+
EXISTS(SELECT 1 FROM information_schema.tables WHERE table_name = 'alert_history') as exists;
|
|
32
|
+
|
|
33
|
+
-- 检查 namespaces 表的关键列
|
|
34
|
+
SELECT
|
|
35
|
+
column_name,
|
|
36
|
+
data_type,
|
|
37
|
+
is_nullable,
|
|
38
|
+
column_default
|
|
39
|
+
FROM information_schema.columns
|
|
40
|
+
WHERE table_name = 'namespaces'
|
|
41
|
+
AND column_name IN ('id', 'name', 'redis_config', 'pg_config', 'version', 'is_active')
|
|
42
|
+
ORDER BY ordinal_position;
|
|
43
|
+
|
|
44
|
+
-- 检查索引
|
|
45
|
+
SELECT
|
|
46
|
+
indexname,
|
|
47
|
+
tablename,
|
|
48
|
+
indexdef
|
|
49
|
+
FROM pg_indexes
|
|
50
|
+
WHERE schemaname = 'public'
|
|
51
|
+
AND tablename IN ('namespaces', 'scheduled_tasks', 'tasks', 'task_runs', 'alert_rules', 'alert_history')
|
|
52
|
+
ORDER BY tablename, indexname;
|
|
53
|
+
|
|
54
|
+
-- 检查分区表
|
|
55
|
+
SELECT
|
|
56
|
+
parent.relname AS parent_table,
|
|
57
|
+
child.relname AS partition_name,
|
|
58
|
+
pg_get_expr(child.relpartbound, child.oid, true) AS partition_expression
|
|
59
|
+
FROM pg_inherits
|
|
60
|
+
JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
|
|
61
|
+
JOIN pg_class child ON pg_inherits.inhrelid = child.oid
|
|
62
|
+
WHERE parent.relname IN ('tasks', 'task_runs', 'stream_backlog_monitor')
|
|
63
|
+
ORDER BY parent.relname, child.relname;
|
|
64
|
+
|
|
65
|
+
-- 检查触发器
|
|
66
|
+
SELECT
|
|
67
|
+
trigger_name,
|
|
68
|
+
event_object_table,
|
|
69
|
+
action_statement
|
|
70
|
+
FROM information_schema.triggers
|
|
71
|
+
WHERE trigger_schema = 'public'
|
|
72
|
+
ORDER BY event_object_table, trigger_name;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: jettask
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.17
|
|
4
4
|
Summary: A high-performance distributed task queue system with web monitoring
|
|
5
5
|
Author-email: JetTask Team <support@jettask.io>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -40,6 +40,7 @@ Requires-Dist: croniter>=1.4.0
|
|
|
40
40
|
Requires-Dist: click>=8.1.0
|
|
41
41
|
Requires-Dist: python-dotenv>=1.0.0
|
|
42
42
|
Requires-Dist: psutil>=5.9.0
|
|
43
|
+
Requires-Dist: nacos_tools
|
|
43
44
|
Provides-Extra: dev
|
|
44
45
|
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
45
46
|
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
jettask/__init__.py,sha256=47VRBRUO5FL1efkUz1wmo3o-Gh7yiKhUjPuWvc0PuI0,362
|
|
2
|
+
jettask/__main__.py,sha256=NfkMpD7z2Jc6YrgbZaBlgCGO621zIi632Ee-P87UcfU,5556
|
|
3
|
+
jettask/api.py,sha256=agK2l6zBq4KRcthX5GexDBMo9rYgCtSGPgWemucuexk,95867
|
|
4
|
+
jettask/cleanup_deprecated_tables.sql,sha256=RmgwI1zx1qWiy4OXtTYPvBRFICkeqzC-1_xWOsnrrlI,529
|
|
5
|
+
jettask/cli.py,sha256=ILj5uSk8LvCvrnTwbbLg75aNYx2Kr0Nm08IAjbKMzo0,35042
|
|
6
|
+
jettask/constants.py,sha256=rw06U4WPSFk6f80blC0ebkqnPUS_eteKQesTSBXKn6A,7028
|
|
7
|
+
jettask/db_init.py,sha256=QQ7SMQN5tqU3mlz3jpc5XPlSRgzXgVV2C20WRCtvHrM,15363
|
|
8
|
+
jettask/exceptions.py,sha256=aQTUpiF2ftiZwGORUHXatAKbDEzptUf6iP7ZOXBQ3tQ,1971
|
|
9
|
+
jettask/gradio_app.py,sha256=ija3UDwWczbp5j0QwNxWw48MW-r9n4NsQkcxL67A14s,22650
|
|
10
|
+
jettask/integrated_gradio_app.py,sha256=JZySKZMwmiLELJi6EOcZcTEVRxC5BHpTU9TjAkmfGmg,44634
|
|
11
|
+
jettask/main.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
|
+
jettask/models.py,sha256=QHYqU_6X5mTDFW_DA1aFQJ6kdmFRgVs4shqr7RJUXzk,2026
|
|
13
|
+
jettask/multi_namespace_consumer.py,sha256=zKavB0EOGO6aLerRTvGeSdfFhdB9q3rVzcIP1fSUdV0,23146
|
|
14
|
+
jettask/pg_consumer.py,sha256=EXtiK0ec77BbVQLSuuNbLpeeM5cDJBTksgQrAz02wVg,96347
|
|
15
|
+
jettask/router.py,sha256=RWlaQKDeQIHqqshT026wGKMLk3HtnqM_8L6d7MgPP_4,5177
|
|
16
|
+
jettask/run.py,sha256=OiHdQpc86e6JU1KfxGg_jTHSV7375udxrrcd_4_gnPw,1433
|
|
17
|
+
jettask/run_monitor.py,sha256=n6aCsKE4BnjSTBPEJlFIU6b465pCcXJZZIsd5kUCvE0,562
|
|
18
|
+
jettask/run_webui.py,sha256=aWf1f1bITfNFqsgIdVKDgCOpfPBSfmXJvhjb_aHPeBI,4501
|
|
19
|
+
jettask/schema.sql,sha256=IY-vLzj3TYoR4p51ChLuSxzo4KU1PQNFNDutc7p0nHg,4490
|
|
20
|
+
jettask/task_center.py,sha256=BcJOaKAeUKDl75GQzoQdBkZdBiC4gPxLrNa5VbKC86I,8537
|
|
21
|
+
jettask/task_center_client.py,sha256=BAls3E02LBhBrEaOadGLQQg28Yx5wYt-sv-U39aRpYM,5957
|
|
22
|
+
jettask/unified_consumer_manager.py,sha256=568KKQFUFuDbbn4eUfvZzH4iYR-UOoiumsweHttrQD8,7424
|
|
23
|
+
jettask/webui_config.py,sha256=8THiJZIbnmhMN3iVvynGuE2U8POxvldcG8pqwXFkWGo,2854
|
|
24
|
+
jettask/webui_exceptions.py,sha256=aQTUpiF2ftiZwGORUHXatAKbDEzptUf6iP7ZOXBQ3tQ,1971
|
|
25
|
+
jettask/api/__init__.py,sha256=gUskl_HqYIQTzqaf8z8wq1OIX6iJcuSl_sy9NzkGxHA,3391
|
|
26
|
+
jettask/api/v1/__init__.py,sha256=AvzzOJ1W38LrDkyPiNQODaGiSdF4olYR0xy-ZpyIIJg,1243
|
|
27
|
+
jettask/api/v1/alerts.py,sha256=rnRbN43KlmwRxbLJKzgMRU-P_CPNTfJTa3oOZ3l9fI8,6214
|
|
28
|
+
jettask/api/v1/analytics.py,sha256=w6jcR5njOz9KIDocDO53E2XuYZ06CtaDjH1aD3yI6zo,8595
|
|
29
|
+
jettask/api/v1/namespaces.py,sha256=aIxi19Cj8QbXhfwgSa1gD_YR3qHXLMI4eyXPrt_gWoQ,4200
|
|
30
|
+
jettask/api/v1/overview.py,sha256=ab3jAqdmVsyVjeQWPFcuF4JxqMkIve4rqm9ghCpa3-w,4175
|
|
31
|
+
jettask/api/v1/queues.py,sha256=zrZMlqn9t9RnHD2X24nvMPvXGOJ1-peJnaMbgw7WRes,17665
|
|
32
|
+
jettask/api/v1/scheduled.py,sha256=Zfha0z0nP72WL8VNTRitcPGwtxaLdgiEC5viHUwAet8,13484
|
|
33
|
+
jettask/api/v1/settings.py,sha256=UQ_jwp-m6y-cVaN9srxt31ltAzUoikgE2SfBzx8IlnE,1184
|
|
34
|
+
jettask/backend/__init__.py,sha256=OK2w-Nm0pF2nqNhhUoSRIDHFnAsQBJdPlIyp5_RU-Rw,32
|
|
35
|
+
jettask/backend/config.py,sha256=dJ9UkWRR1kulHFhfSVXmT_bM-N7yEMJdp0JylUkrLZ4,2062
|
|
36
|
+
jettask/backend/data_access.py,sha256=5gC4x4XL7YpWsRoJxalgT05hr05wtHf82jT36JE_JOQ,115164
|
|
37
|
+
jettask/backend/dependencies.py,sha256=ZG8_O9rDrdSOyImqaxDbimK-Cf8ZrZyRNq_VS3WWWsk,8236
|
|
38
|
+
jettask/backend/init_meta_db.py,sha256=_QRQKlnatfYpz8C9ygqiazO8lNye7HIn5x41-y5snIw,5482
|
|
39
|
+
jettask/backend/main.py,sha256=RM83CHYcyBR6Ha_C9bLRZMsZiF1HZiV9ChjiZQacXDo,50913
|
|
40
|
+
jettask/backend/main_unified.py,sha256=Fw7j2PPXJhQ8iAPbNNl1RuWqWxidTQhImJ1i0M6JswQ,2086
|
|
41
|
+
jettask/backend/main_v2.py,sha256=XU7LZriOuTcMHt8rZTeNUAtY7HBIu50vzJT-f8_AbCs,11603
|
|
42
|
+
jettask/backend/namespace_api_old.py,sha256=ZNTN_W4JybtHofWMqxd9PyIZ6rRSOWOWGRcXnzrVeCI,10553
|
|
43
|
+
jettask/backend/namespace_data_access.py,sha256=SERjZSuVxIA5fE3osJReRydbppp6HNk4RG9OGmesRXQ,25859
|
|
44
|
+
jettask/backend/queue_stats_v2.py,sha256=VeI46WQREFAQgqW330eKs0jO7ZBehLIEKsxAAu907T8,24402
|
|
45
|
+
jettask/backend/start.py,sha256=HMY7QMfWewmgJQTUamjzGV8YONTpjH4B9_W7fbL6_hE,1060
|
|
46
|
+
jettask/backend/unified_api_router.py,sha256=F0N_sOMdzbzj3YakYtNDkhW1Hk19_W6RriG0wxWN0YY,58267
|
|
47
|
+
jettask/backend/api/__init__.py,sha256=2vM3ARaoFV6FAMfhRIEK3BVVRUfsdciYdHH2piNrXn8,44
|
|
48
|
+
jettask/backend/api/v1/__init__.py,sha256=6QopP8txnoYol62VxB8omXrRDH_BQym1ZxQ9DqKst7Y,638
|
|
49
|
+
jettask/backend/api/v1/monitoring.py,sha256=u9qRhSfDV8r_tNC4lJb7yiOUsvgpqEZFGhuUMkxNy1U,15239
|
|
50
|
+
jettask/backend/api/v1/namespaces.py,sha256=I_0aMui5E0n2b3EpljY92Y9FY8KIhbMyoXB1eoQV3jg,18838
|
|
51
|
+
jettask/backend/api/v1/queues.py,sha256=c3AsdSmSku0JrPBSvPcpN3lic7srq6PPgUza3OhUaiQ,13138
|
|
52
|
+
jettask/backend/api/v1/tasks.py,sha256=4i05ToZmn3sZ8Ll-Ak-WwTg78_8iQM2vXUsVzqChSRQ,13250
|
|
53
|
+
jettask/backend/core/__init__.py,sha256=_VvuKQCXSZo_WaKhtFm8ArKGo44DWMPrS9i_TF1sf8g,61
|
|
54
|
+
jettask/backend/core/cache.py,sha256=F0TXkh8Vf4lCWZKNaQyxqwkl_xcuY4lFyqUFX6hQ__s,6789
|
|
55
|
+
jettask/backend/core/database.py,sha256=7HNesi-1MDm2HydhvyhHpCk066hJ7Dm0XaxO1QxggQo,7899
|
|
56
|
+
jettask/backend/core/exceptions.py,sha256=hC11lxkdaepfVhZONSEaQWo288ebHbx0BdZWxUK62Js,2951
|
|
57
|
+
jettask/backend/models/__init__.py,sha256=dSUQ2573SBZklLsuGrnd3QRFluUhXTg2ExdCiV1OWBk,45
|
|
58
|
+
jettask/backend/models/requests.py,sha256=fsHiv4sU46biQ1bK1KfV-yxak0LRoFLoe-dPvHSLC00,10002
|
|
59
|
+
jettask/backend/models/responses.py,sha256=FwGpAFNL61a2okJFD41TYLcuwu-41FHXrk6P190jxzw,8528
|
|
60
|
+
jettask/backend/services/__init__.py,sha256=DCf9NuJo1a65q3CXG0GtRksQpDhg3QuvmTYiWjxGjVE,57
|
|
61
|
+
jettask/config/__init__.py,sha256=qCRGmiXSK45LDU9pr0bUC-VoZAkTK1jAch1i9tvHCeE,158
|
|
62
|
+
jettask/config/nacos_config.py,sha256=ujipoLitNYKJDFMm_zskaLmFF4eoRFCU0L7p-s5LW08,14172
|
|
63
|
+
jettask/config/performance.py,sha256=bOdLEskfB_6cRfS10IRgmtKEsJw_CaIZsPHbXxaHwbU,5686
|
|
64
|
+
jettask/core/__init__.py,sha256=CvBoBCERXCo-jgnkPqAuIgT4uC7oQMnSi7okRxMi6Vc,181
|
|
65
|
+
jettask/core/app.py,sha256=qQPYl74uKV1ZgnuNTvPNPD0F_JVH20oZrsz9jIJusjk,70737
|
|
66
|
+
jettask/core/app_importer.py,sha256=B8WiSUz5_O5jlFIBr1CxI_F2gqFYK6ItpONiY_4AiXI,10266
|
|
67
|
+
jettask/core/consumer_manager.py,sha256=7z3IBvH85YD61ZkVNfOVsuP5NaAwV2Ki8aVz9TCplAM,79870
|
|
68
|
+
jettask/core/context.py,sha256=XI4Q1s75NIWImcrHIkCLgGo_kpuJIk8MlBoNIJuEfF0,993
|
|
69
|
+
jettask/core/db_manager.py,sha256=M6NXRAKXrdQBTjdj8LjxW3OEe7LZE5aqq1HFQaP1AYg,17602
|
|
70
|
+
jettask/core/delay_scanner.py,sha256=rwbIA7SFyOxAV14FW7NB40_djFrrqJJpNkpOri7XcZI,8394
|
|
71
|
+
jettask/core/enums.py,sha256=ufXI5OcGZoOSbLEyAWtnkZVO-LcqNbIOygyjLLa6ce8,4632
|
|
72
|
+
jettask/core/event_pool.py,sha256=_UQN07hfQqKlq2ejdXTsxgXmbks9uEUlMv246JKJTsc,85088
|
|
73
|
+
jettask/core/heartbeat_process.py,sha256=G-4rHSMgHIvFCRPlZeh91tKd0Fir8jJ9YVL4vdajQDE,9233
|
|
74
|
+
jettask/core/message.py,sha256=WDOY8kvoV6at4MsIP01c3GJmIwHvRnUHimli6NKcw8w,4340
|
|
75
|
+
jettask/core/offline_worker_recovery.py,sha256=L1i61RN5NnPiP7neudmdb_qYMEEvIYRd39OvZ6gwjZk,23633
|
|
76
|
+
jettask/core/retry.py,sha256=lX56Z0fvKjEhVbYPHYdoN-W4XUPVplHlfIOupBylEeI,10711
|
|
77
|
+
jettask/core/task.py,sha256=7VygTXcsBPjkfecz2oGXIVECvuuEI_p4lCjE2FzvLZc,5261
|
|
78
|
+
jettask/core/task_batch.py,sha256=lSI4ijf7YrMqS9m9NX3qQ3_HMkrCVZ3LGHL_zDOKc4k,4339
|
|
79
|
+
jettask/core/unified_manager_base.py,sha256=Nc3hMzFJeQaMajoXH6A5u0-LCd2jcT9MxEX-VCFUjUU,12050
|
|
80
|
+
jettask/core/worker_scanner.py,sha256=_ZFlH7eKeg-2lIL-3JFMV_Oht9Shf7VMEw_uyCBh5Tc,11277
|
|
81
|
+
jettask/executors/__init__.py,sha256=1aXRvwHzlypVcHNYy60UgUELOlNmbPp8oFMS5T0tJbs,186
|
|
82
|
+
jettask/executors/asyncio.py,sha256=zy2mezaRtri2RYXzl7jG9_idnvX9edFiTZWutPLfx9U,43167
|
|
83
|
+
jettask/executors/base.py,sha256=XwTIb8-_pTr_C3skRBOy9qgVpGOlFux258BNKG6CP6k,776
|
|
84
|
+
jettask/executors/common.py,sha256=eLYtBSzh44hHEiJAHFXtNyIMucsOTc2O-IZJt143OYg,6246
|
|
85
|
+
jettask/executors/multi_asyncio.py,sha256=M3Jpx8Eak1XYiQRuO3MwBbZ58vZWJbsiju3ltb-XEPI,13002
|
|
86
|
+
jettask/monitor/run_backlog_collector.py,sha256=hEe8VqlObgWQgVEmy5B6DfnCD9RIjMHPO54CUpnEEVs,2530
|
|
87
|
+
jettask/monitor/stream_backlog_monitor.py,sha256=UuA6FUXhvw17XuZE0QNAtQIju3-5jj7Ltf2x9ib_VnQ,15639
|
|
88
|
+
jettask/monitoring/__init__.py,sha256=xWEEH5C2e8TW2iH6KNxBj5R-aTMg1GH3DrrwjRzRGD4,76
|
|
89
|
+
jettask/monitoring/file_watcher.py,sha256=r3Mgekb_5sOssDrnFBCbbyvpWkwD2ZPA_j22ztzRCT0,1207
|
|
90
|
+
jettask/pg_consumer/pg_consumer_v2.py,sha256=ajd6ZM_HY9YWK_I5BNbGuWxNqSS892d3ZzvDlTSQgwc,16211
|
|
91
|
+
jettask/pg_consumer/sql_utils.py,sha256=dZM_8kIzUmRq0me4yLwb3UeoDvIVKJdIc9VNP1nbS0E,6461
|
|
92
|
+
jettask/pg_consumer/sql/add_execution_time_field.sql,sha256=z2Jx-0uG-IW5RsTGxcLFu2_BcMReluEptMJWB6Qrj08,1184
|
|
93
|
+
jettask/pg_consumer/sql/create_new_tables.sql,sha256=layb08_MFGVSE-NQEcjlQBklZ307JtJaccrnqkcj7Vg,6566
|
|
94
|
+
jettask/pg_consumer/sql/create_tables_v3.sql,sha256=ZwBjxKWU6imWACoWMCIACLsYUPiPep9WmJsdIjI2a58,8173
|
|
95
|
+
jettask/pg_consumer/sql/migrate_to_new_structure.sql,sha256=elhObWvbtqAhb4osJC6D5JhxcOxhGJgIBqx4ItB_xO8,5716
|
|
96
|
+
jettask/pg_consumer/sql/modify_time_fields.sql,sha256=mRfoXbP9iXbAJBj-xNume8-4AV_UPQcBALNUqEf3aKw,2572
|
|
97
|
+
jettask/scheduler/__init__.py,sha256=egJ-b3VjifFPOFhdEe6JOGyBBNxtqtH4cQvB6Vm_t-c,372
|
|
98
|
+
jettask/scheduler/add_execution_count.sql,sha256=x4jBsOFGj4JvEd-Ene3OhbR5QCKh5rv8dF01_qLSeE8,383
|
|
99
|
+
jettask/scheduler/add_priority_field.sql,sha256=z9S10u2D2eekVqB8xOAtDD4Rw1Ey497cmDL4pN2MgB0,915
|
|
100
|
+
jettask/scheduler/add_scheduler_id.sql,sha256=uDPSnYVjGE75LcOMKuT2kMEbCPW1JEbDq0uMqmN68aQ,818
|
|
101
|
+
jettask/scheduler/add_scheduler_id_index.sql,sha256=xaY4uXa5QitIEgx4tcDqh1SRZ1NIZXuq5NtQQH_4Liw,471
|
|
102
|
+
jettask/scheduler/loader.py,sha256=oZtz-RbXlxlHbzUOE2WVutPljtXV7SuPRU0W-4KGlVM,8727
|
|
103
|
+
jettask/scheduler/make_scheduler_id_required.sql,sha256=ksZ8rA7cAobrcQk3t93CrTePE2G40KQNESqA9WyPF50,854
|
|
104
|
+
jettask/scheduler/manager.py,sha256=atbDUwlW5NmzrEx63FtKcr508qWfSja5pcE8NDIdo_U,26508
|
|
105
|
+
jettask/scheduler/migrate_interval_seconds.sql,sha256=40MSij1-YsOX7mQU958v7Qsse6NCId0R6NkZEjeWr-8,391
|
|
106
|
+
jettask/scheduler/models.py,sha256=Mv-csKjsrYp4nI2H6IldCh6avu-9ke5YTfyufhlYjKI,7376
|
|
107
|
+
jettask/scheduler/multi_namespace_scheduler.py,sha256=629GGTMi8Rsaw62kzkt4Y8yF59WQMjHk67yrQP3I-4A,11375
|
|
108
|
+
jettask/scheduler/performance_optimization.sql,sha256=sXa5dh4DAAgjj8CsfByjCePcAXtGnxKwwPyMgbMbG2I,1733
|
|
109
|
+
jettask/scheduler/run_scheduler.py,sha256=zRp_V5D7CaTsfEDSEuzISN4Pdypj3NR62zbJn8R5JOQ,6305
|
|
110
|
+
jettask/scheduler/scheduler.py,sha256=PUEqVlYH_SyCYxKj0xzvig78AHzpoYhcUHAnLP9v5MU,27733
|
|
111
|
+
jettask/scheduler/schema.sql,sha256=iBGUrsMYv9_FQCr_0b5DC-XFUXOaLIjnwWH-yvy4LdM,4109
|
|
112
|
+
jettask/scheduler/unified_manager.py,sha256=rah9xUiZlTJiKu_2EuuM6shn9vAEE3KJ3tMpXlzhmGk,17580
|
|
113
|
+
jettask/scheduler/unified_scheduler_manager.py,sha256=6sVsoaa_bXg49WbDsrZARY024UhfWISg9Oo4_ujpJDU,11734
|
|
114
|
+
jettask/schemas/__init__.py,sha256=YtyBjdLtZCceqmeVohlykFdgl5xtF_w9jtRmBfMRlqk,3170
|
|
115
|
+
jettask/schemas/alert.py,sha256=Od29QjDrnLN1Tw_F2rPFSGsqRvbBcO2hf1d8GO1_WEQ,4958
|
|
116
|
+
jettask/schemas/backlog.py,sha256=Qxl5I2cVI1ek1JujLl8I55IFINpXZr0Kbd1WWoyyRQg,5493
|
|
117
|
+
jettask/schemas/common.py,sha256=e1lrLnOpxKT25FH7QnDQy38Qj4SGqd_cwHvRObTuRZw,6038
|
|
118
|
+
jettask/schemas/monitoring.py,sha256=zPfNv6YXw3uufj61PseQTaQkpwa9azgsnCGUaF4HNUk,8084
|
|
119
|
+
jettask/schemas/namespace.py,sha256=0KZC2V--mmMIxzS7Yn2P4ue6lo9Ui0HGcez8gfNK8Vo,8625
|
|
120
|
+
jettask/schemas/queue.py,sha256=uier_qvrJWiZYh6m1rWM84mBjoKS6DjABM0WBTu9ToM,3968
|
|
121
|
+
jettask/schemas/scheduled_task.py,sha256=MPAXvDeqmyQTWhL31yS94mRuzJWOV4njukp6BQrX6K4,7130
|
|
122
|
+
jettask/schemas/task.py,sha256=niW2F_84HvstAjX3vo2pZswoRwMCF3DIoONuHwWNwtk,3172
|
|
123
|
+
jettask/services/__init__.py,sha256=6BvdLBzDFu_hdU6tnOkv9eIf1xkJ89T_Ctlu0bRpWy0,630
|
|
124
|
+
jettask/services/alert_service.py,sha256=AIk4hjx-yoFnl5vPff7TMwjgjheKu91da9mZ5gYDroo,14169
|
|
125
|
+
jettask/services/analytics_service.py,sha256=zLTtGUJ7wYIU7O5NP_VS_-wk_IXNfxKikAvQ3aaeCmI,1101
|
|
126
|
+
jettask/services/overview_service.py,sha256=qOc2fCXLyceBRRFORDjFE_sNIFdfVe6Bej3is4lxfIw,36546
|
|
127
|
+
jettask/services/queue_service.py,sha256=wTInU2mEBAE9e5iwFAdKFxrYdcJbQrBFpE26VyRy9BU,27412
|
|
128
|
+
jettask/services/redis_monitor_service.py,sha256=2l6fF2qAtctS9HUaEV3acJMJ5zhkvT4iygJGhGBCoKw,3660
|
|
129
|
+
jettask/services/scheduled_task_service.py,sha256=ZFFtcUdk_IDGm17maHA1Hb0p00_56QqQ9ETFAF7T1bU,6226
|
|
130
|
+
jettask/services/settings_service.py,sha256=PKEwlYDaYA0VTiwW5ZiXASFazVyOmFlN1jbgSZdAvP8,31561
|
|
131
|
+
jettask/services/task_service.py,sha256=vfSEyhFxDcEzOuA4sHEg1sYvLriUUvJ08SQ2ICG7MSU,4751
|
|
132
|
+
jettask/utils/__init__.py,sha256=7oEoX1Au4GxQ_hbXjSc1q5titSBWsi-62UIIUbZ7zto,133
|
|
133
|
+
jettask/utils/error_handler.py,sha256=9iYHCInUkEkP9o07dUgPxQr4aWqR5FUhnNWLgB0TEqM,2794
|
|
134
|
+
jettask/utils/exception_hook.py,sha256=Fp0m71_jjmmZvyoELARSsPIvSVPCmMQMVC1FxMFOoHQ,1765
|
|
135
|
+
jettask/utils/helpers.py,sha256=uTdyRFZsdwSQzuEcNoGgADuVnHaDEYq6JQP6zVxAj04,3368
|
|
136
|
+
jettask/utils/logger.py,sha256=PcZgUtx7I9pe90Y8WgPQtKhMefd1oQ14pgUlKCFpCXo,843
|
|
137
|
+
jettask/utils/serializer.py,sha256=kTVDtPz1gwkmspeazNNjuCqrYxJLc2bzqmS8_I0Zxn0,714
|
|
138
|
+
jettask/utils/serializer_optimized.py,sha256=UijmvEX6WQBnaNL653z9YOmpxADdEtfS3wQMMBl5_KI,883
|
|
139
|
+
jettask/utils/task_logger.py,sha256=kauCgiDDzhuge3wk-BXR_KwytOfmrrVBKe1S4XUWBXU,13628
|
|
140
|
+
jettask/utils/traceback_filter.py,sha256=2svLo5_OoosAbS08UpceeWtjSKkdx-Fp6U-ysJQkroY,3025
|
|
141
|
+
jettask/webui_models/__init__.py,sha256=5cv0oZksj1B3_rzCqsPmF3Gn9NRZLwzMnaJ8bOKGB4I,25
|
|
142
|
+
jettask/webui_models/namespace.py,sha256=jDj-hZF_-wXzrWAWVDyZVU0JUWDax9apb4Gyykwg-rE,2006
|
|
143
|
+
jettask/webui_sql/batch_upsert_functions.sql,sha256=5eWOhOD8gWHhtcop_BrCpZTxPFeyBHtt_leNQZO89Cs,6615
|
|
144
|
+
jettask/webui_sql/verify_database.sql,sha256=HtTup3xHWbOo1BTU_u4i41E9LrPEXB8qYbChL9WeWOc,2313
|
|
145
|
+
jettask-0.2.17.dist-info/licenses/LICENSE,sha256=sKR8OPWvnqxzcHAmnaVSANpRpeM0Z52PNLCB0ZlFN6c,1062
|
|
146
|
+
jettask-0.2.17.dist-info/METADATA,sha256=HzHoLAEpRA0_CiQryit3sciGQ_Yllvtkd73a8UaWDf4,3015
|
|
147
|
+
jettask-0.2.17.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
148
|
+
jettask-0.2.17.dist-info/entry_points.txt,sha256=9-8eTLJPgzpBgeGC8WHdMYtldZxHAXFspMeqArVUdew,148
|
|
149
|
+
jettask-0.2.17.dist-info/top_level.txt,sha256=uymyRUF87-OsSurk5NhpeTW0jy3Wltnn91Zoa6jmAaw,8
|
|
150
|
+
jettask-0.2.17.dist-info/RECORD,,
|