jettask 0.2.20__py3-none-any.whl → 0.2.24__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 +4 -0
- jettask/cli.py +12 -8
- jettask/config/lua_scripts.py +37 -0
- jettask/config/nacos_config.py +1 -1
- jettask/core/app.py +313 -340
- jettask/core/container.py +4 -4
- jettask/{persistence → core}/namespace.py +93 -27
- jettask/core/task.py +16 -9
- jettask/core/unified_manager_base.py +136 -26
- jettask/db/__init__.py +67 -0
- jettask/db/base.py +137 -0
- jettask/{utils/db_connector.py → db/connector.py} +130 -26
- jettask/db/models/__init__.py +16 -0
- jettask/db/models/scheduled_task.py +196 -0
- jettask/db/models/task.py +77 -0
- jettask/db/models/task_run.py +85 -0
- jettask/executor/__init__.py +0 -15
- jettask/executor/core.py +76 -31
- jettask/executor/process_entry.py +29 -114
- jettask/executor/task_executor.py +4 -0
- jettask/messaging/event_pool.py +928 -685
- jettask/messaging/scanner.py +30 -0
- jettask/persistence/__init__.py +28 -103
- jettask/persistence/buffer.py +170 -0
- jettask/persistence/consumer.py +330 -249
- jettask/persistence/manager.py +304 -0
- jettask/persistence/persistence.py +391 -0
- jettask/scheduler/__init__.py +15 -3
- jettask/scheduler/{task_crud.py → database.py} +61 -57
- jettask/scheduler/loader.py +2 -2
- jettask/scheduler/{scheduler_coordinator.py → manager.py} +23 -6
- jettask/scheduler/models.py +14 -10
- jettask/scheduler/schedule.py +166 -0
- jettask/scheduler/scheduler.py +12 -11
- jettask/schemas/__init__.py +50 -1
- jettask/schemas/backlog.py +43 -6
- jettask/schemas/namespace.py +70 -19
- jettask/schemas/queue.py +19 -3
- jettask/schemas/responses.py +493 -0
- jettask/task/__init__.py +0 -2
- jettask/task/router.py +3 -0
- jettask/test_connection_monitor.py +1 -1
- jettask/utils/__init__.py +7 -5
- jettask/utils/db_init.py +8 -4
- jettask/utils/namespace_dep.py +167 -0
- jettask/utils/queue_matcher.py +186 -0
- jettask/utils/rate_limit/concurrency_limiter.py +7 -1
- jettask/utils/stream_backlog.py +1 -1
- jettask/webui/__init__.py +0 -1
- jettask/webui/api/__init__.py +4 -4
- jettask/webui/api/alerts.py +806 -71
- jettask/webui/api/example_refactored.py +400 -0
- jettask/webui/api/namespaces.py +390 -45
- jettask/webui/api/overview.py +300 -54
- jettask/webui/api/queues.py +971 -267
- jettask/webui/api/scheduled.py +1249 -56
- jettask/webui/api/settings.py +129 -7
- jettask/webui/api/workers.py +442 -0
- jettask/webui/app.py +46 -2329
- jettask/webui/middleware/__init__.py +6 -0
- jettask/webui/middleware/namespace_middleware.py +135 -0
- jettask/webui/services/__init__.py +146 -0
- jettask/webui/services/heartbeat_service.py +251 -0
- jettask/webui/services/overview_service.py +60 -51
- jettask/webui/services/queue_monitor_service.py +426 -0
- jettask/webui/services/redis_monitor_service.py +87 -0
- jettask/webui/services/settings_service.py +174 -111
- jettask/webui/services/task_monitor_service.py +222 -0
- jettask/webui/services/timeline_pg_service.py +452 -0
- jettask/webui/services/timeline_service.py +189 -0
- jettask/webui/services/worker_monitor_service.py +467 -0
- jettask/webui/utils/__init__.py +11 -0
- jettask/webui/utils/time_utils.py +122 -0
- jettask/worker/lifecycle.py +8 -2
- {jettask-0.2.20.dist-info → jettask-0.2.24.dist-info}/METADATA +1 -1
- jettask-0.2.24.dist-info/RECORD +142 -0
- jettask/executor/executor.py +0 -338
- jettask/persistence/backlog_monitor.py +0 -567
- jettask/persistence/base.py +0 -2334
- jettask/persistence/db_manager.py +0 -516
- jettask/persistence/maintenance.py +0 -81
- jettask/persistence/message_consumer.py +0 -259
- jettask/persistence/models.py +0 -49
- jettask/persistence/offline_recovery.py +0 -196
- jettask/persistence/queue_discovery.py +0 -215
- jettask/persistence/task_persistence.py +0 -218
- jettask/persistence/task_updater.py +0 -583
- jettask/scheduler/add_execution_count.sql +0 -11
- jettask/scheduler/add_priority_field.sql +0 -26
- jettask/scheduler/add_scheduler_id.sql +0 -25
- jettask/scheduler/add_scheduler_id_index.sql +0 -10
- jettask/scheduler/make_scheduler_id_required.sql +0 -28
- jettask/scheduler/migrate_interval_seconds.sql +0 -9
- jettask/scheduler/performance_optimization.sql +0 -45
- jettask/scheduler/run_scheduler.py +0 -186
- jettask/scheduler/schema.sql +0 -84
- jettask/task/task_executor.py +0 -318
- jettask/webui/api/analytics.py +0 -323
- jettask/webui/config.py +0 -90
- jettask/webui/models/__init__.py +0 -3
- jettask/webui/models/namespace.py +0 -63
- jettask/webui/namespace_manager/__init__.py +0 -10
- jettask/webui/namespace_manager/multi.py +0 -593
- jettask/webui/namespace_manager/unified.py +0 -193
- jettask/webui/run.py +0 -46
- jettask-0.2.20.dist-info/RECORD +0 -145
- {jettask-0.2.20.dist-info → jettask-0.2.24.dist-info}/WHEEL +0 -0
- {jettask-0.2.20.dist-info → jettask-0.2.24.dist-info}/entry_points.txt +0 -0
- {jettask-0.2.20.dist-info → jettask-0.2.24.dist-info}/licenses/LICENSE +0 -0
- {jettask-0.2.20.dist-info → jettask-0.2.24.dist-info}/top_level.txt +0 -0
jettask/__init__.py
CHANGED
@@ -9,8 +9,10 @@ import inspect
|
|
9
9
|
# Core class imports
|
10
10
|
from jettask.core.app import Jettask
|
11
11
|
from jettask.core.message import TaskMessage
|
12
|
+
from jettask.core.context import TaskContext
|
12
13
|
from jettask.task.task_center.client import TaskCenter
|
13
14
|
from jettask.task.router import TaskRouter
|
15
|
+
from jettask.scheduler.schedule import Schedule
|
14
16
|
|
15
17
|
# Rate limit config imports
|
16
18
|
from jettask.utils.rate_limit.config import QPSLimit, ConcurrencyLimit
|
@@ -68,10 +70,12 @@ def get_task_logger(name: str = None) -> logging.Logger:
|
|
68
70
|
__all__ = [
|
69
71
|
"Jettask",
|
70
72
|
"TaskMessage",
|
73
|
+
"Schedule",
|
71
74
|
"TaskCenter",
|
72
75
|
"TaskRouter",
|
73
76
|
"QPSLimit",
|
74
77
|
"ConcurrencyLimit",
|
75
78
|
"get_task_logger",
|
76
79
|
"LogContext",
|
80
|
+
"TaskContext"
|
77
81
|
]
|
jettask/cli.py
CHANGED
@@ -473,11 +473,14 @@ def worker(ctx, app_str, queues, concurrency, prefetch, reload):
|
|
473
473
|
@click.option('--task-center', '-tc', envvar='JETTASK_CENTER_URL', required=True,
|
474
474
|
help='任务中心URL,如: http://localhost:8001 或 http://localhost:8001/api/namespaces/default')
|
475
475
|
@click.option('--check-interval', type=int, default=30,
|
476
|
-
help='
|
476
|
+
help='命名空间检测间隔(秒),仅多命名空间模式使用,默认30秒')
|
477
|
+
@click.option('--concurrency', '-c', type=int, default=4,
|
478
|
+
help='并发数(每个命名空间的 worker 进程数),默认4')
|
477
479
|
@click.option('--debug', is_flag=True, help='启用调试模式')
|
478
|
-
def webui_consumer(task_center, check_interval, debug):
|
479
|
-
"""
|
480
|
+
def webui_consumer(task_center, check_interval, concurrency, debug):
|
481
|
+
"""启动 PostgreSQL 数据消费者(自动识别单/多命名空间)
|
480
482
|
|
483
|
+
从 Redis 队列消费任务并持久化到 PostgreSQL 数据库。
|
481
484
|
根据URL格式自动判断运行模式:
|
482
485
|
- 单命名空间: http://localhost:8001/api/namespaces/{name}
|
483
486
|
- 多命名空间: http://localhost:8001 或 http://localhost:8001/api
|
@@ -491,7 +494,7 @@ def webui_consumer(task_center, check_interval, debug):
|
|
491
494
|
# 为单个命名空间启动消费者
|
492
495
|
jettask webui-consumer --task-center http://localhost:8001/api/namespaces/default
|
493
496
|
|
494
|
-
#
|
497
|
+
# 自定义配置
|
495
498
|
jettask webui-consumer --task-center http://localhost:8001 --check-interval 60
|
496
499
|
|
497
500
|
# 使用环境变量
|
@@ -499,7 +502,7 @@ def webui_consumer(task_center, check_interval, debug):
|
|
499
502
|
jettask webui-consumer
|
500
503
|
"""
|
501
504
|
import asyncio
|
502
|
-
from jettask.
|
505
|
+
from jettask.persistence.manager import UnifiedConsumerManager
|
503
506
|
|
504
507
|
# 运行消费者管理器
|
505
508
|
async def run_manager():
|
@@ -507,6 +510,7 @@ def webui_consumer(task_center, check_interval, debug):
|
|
507
510
|
manager = UnifiedConsumerManager(
|
508
511
|
task_center_url=task_center,
|
509
512
|
check_interval=check_interval,
|
513
|
+
concurrency=concurrency,
|
510
514
|
debug=debug
|
511
515
|
)
|
512
516
|
await manager.run()
|
@@ -514,7 +518,7 @@ def webui_consumer(task_center, check_interval, debug):
|
|
514
518
|
try:
|
515
519
|
asyncio.run(run_manager())
|
516
520
|
except KeyboardInterrupt:
|
517
|
-
click.echo("\
|
521
|
+
click.echo("\n✓ 消费者已关闭")
|
518
522
|
|
519
523
|
# @cli.command()
|
520
524
|
# def monitor():
|
@@ -565,7 +569,7 @@ def status():
|
|
565
569
|
|
566
570
|
# 检查 Redis 连接
|
567
571
|
try:
|
568
|
-
from jettask.
|
572
|
+
from jettask.db.connector import get_sync_redis_client
|
569
573
|
r = get_sync_redis_client('redis://localhost:6379/0', decode_responses=True)
|
570
574
|
r.ping()
|
571
575
|
click.echo("✓ Redis: Connected")
|
@@ -623,7 +627,7 @@ def scheduler(task_center, interval, batch_size, check_interval, debug):
|
|
623
627
|
jettask scheduler
|
624
628
|
"""
|
625
629
|
import asyncio
|
626
|
-
from jettask.scheduler.
|
630
|
+
from jettask.scheduler.manager import UnifiedSchedulerManager
|
627
631
|
|
628
632
|
# 运行调度器管理器
|
629
633
|
async def run_manager():
|
jettask/config/lua_scripts.py
CHANGED
@@ -149,10 +149,47 @@ end
|
|
149
149
|
return results
|
150
150
|
"""
|
151
151
|
|
152
|
+
# Lua脚本:批量发送事件
|
153
|
+
# 用于 _batch_send_event 和 _batch_send_event_sync 方法
|
154
|
+
# 批量发送消息到Stream并自动生成offset,同时注册队列
|
155
|
+
LUA_SCRIPT_BATCH_SEND_EVENT = """
|
156
|
+
local stream_key = KEYS[1]
|
157
|
+
local prefix = ARGV[1]
|
158
|
+
local results = {}
|
159
|
+
|
160
|
+
-- 使用Hash存储所有队列的offset
|
161
|
+
local offsets_hash = prefix .. ':QUEUE_OFFSETS'
|
162
|
+
|
163
|
+
-- 从stream_key中提取队列名(去掉prefix:QUEUE:前缀)
|
164
|
+
local queue_name = string.gsub(stream_key, '^' .. prefix .. ':QUEUE:', '')
|
165
|
+
|
166
|
+
-- 将队列添加到全局队列注册表(包括所有队列,包括优先级队列)
|
167
|
+
local queues_registry_key = prefix .. ':REGISTRY:QUEUES'
|
168
|
+
redis.call('SADD', queues_registry_key, queue_name)
|
169
|
+
|
170
|
+
-- 从ARGV[2]开始,每个参数是一个消息的data
|
171
|
+
for i = 2, #ARGV do
|
172
|
+
local data = ARGV[i]
|
173
|
+
|
174
|
+
-- 使用HINCRBY原子递增offset(如果不存在会自动创建并设为1)
|
175
|
+
local current_offset = redis.call('HINCRBY', offsets_hash, queue_name, 1)
|
176
|
+
|
177
|
+
-- 添加消息到Stream(包含offset字段)
|
178
|
+
local stream_id = redis.call('XADD', stream_key, '*',
|
179
|
+
'data', data,
|
180
|
+
'offset', current_offset)
|
181
|
+
|
182
|
+
table.insert(results, stream_id)
|
183
|
+
end
|
184
|
+
|
185
|
+
return results
|
186
|
+
"""
|
187
|
+
|
152
188
|
__all__ = [
|
153
189
|
'LUA_SCRIPT_DELAYED_TASKS',
|
154
190
|
'LUA_SCRIPT_NORMAL_TASKS',
|
155
191
|
'LUA_SCRIPT_GET_AND_DELETE',
|
156
192
|
'LUA_SCRIPT_BATCH_SEND',
|
157
193
|
'LUA_SCRIPT_SEND_DELAYED_TASKS',
|
194
|
+
'LUA_SCRIPT_BATCH_SEND_EVENT',
|
158
195
|
]
|
jettask/config/nacos_config.py
CHANGED