jettask 0.2.19__py3-none-any.whl → 0.2.23__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 +12 -3
- jettask/cli.py +314 -228
- jettask/config/__init__.py +9 -1
- jettask/config/config.py +245 -0
- jettask/config/env_loader.py +381 -0
- jettask/config/lua_scripts.py +158 -0
- jettask/config/nacos_config.py +132 -5
- jettask/core/__init__.py +1 -1
- jettask/core/app.py +1573 -666
- jettask/core/app_importer.py +33 -16
- jettask/core/container.py +532 -0
- jettask/core/task.py +1 -4
- jettask/core/unified_manager_base.py +2 -2
- jettask/executor/__init__.py +38 -0
- jettask/executor/core.py +625 -0
- jettask/executor/executor.py +338 -0
- jettask/executor/orchestrator.py +290 -0
- jettask/executor/process_entry.py +638 -0
- jettask/executor/task_executor.py +317 -0
- jettask/messaging/__init__.py +68 -0
- jettask/messaging/event_pool.py +2188 -0
- jettask/messaging/reader.py +519 -0
- jettask/messaging/registry.py +266 -0
- jettask/messaging/scanner.py +369 -0
- jettask/messaging/sender.py +312 -0
- jettask/persistence/__init__.py +118 -0
- jettask/persistence/backlog_monitor.py +567 -0
- jettask/{backend/data_access.py → persistence/base.py} +58 -57
- jettask/persistence/consumer.py +315 -0
- jettask/{core → persistence}/db_manager.py +23 -22
- jettask/persistence/maintenance.py +81 -0
- jettask/persistence/message_consumer.py +259 -0
- jettask/{backend/namespace_data_access.py → persistence/namespace.py} +66 -98
- jettask/persistence/offline_recovery.py +196 -0
- jettask/persistence/queue_discovery.py +215 -0
- jettask/persistence/task_persistence.py +218 -0
- jettask/persistence/task_updater.py +583 -0
- jettask/scheduler/__init__.py +2 -2
- jettask/scheduler/loader.py +6 -5
- jettask/scheduler/run_scheduler.py +1 -1
- jettask/scheduler/scheduler.py +7 -7
- jettask/scheduler/{unified_scheduler_manager.py → scheduler_coordinator.py} +18 -13
- jettask/task/__init__.py +16 -0
- jettask/{router.py → task/router.py} +26 -8
- jettask/task/task_center/__init__.py +9 -0
- jettask/task/task_executor.py +318 -0
- jettask/task/task_registry.py +291 -0
- jettask/test_connection_monitor.py +73 -0
- jettask/utils/__init__.py +31 -1
- jettask/{monitor/run_backlog_collector.py → utils/backlog_collector.py} +1 -1
- jettask/utils/db_connector.py +1629 -0
- jettask/{db_init.py → utils/db_init.py} +1 -1
- jettask/utils/rate_limit/__init__.py +30 -0
- jettask/utils/rate_limit/concurrency_limiter.py +665 -0
- jettask/utils/rate_limit/config.py +145 -0
- jettask/utils/rate_limit/limiter.py +41 -0
- jettask/utils/rate_limit/manager.py +269 -0
- jettask/utils/rate_limit/qps_limiter.py +154 -0
- jettask/utils/rate_limit/task_limiter.py +384 -0
- jettask/utils/serializer.py +3 -0
- jettask/{monitor/stream_backlog_monitor.py → utils/stream_backlog.py} +14 -6
- jettask/utils/time_sync.py +173 -0
- jettask/webui/__init__.py +27 -0
- jettask/{api/v1 → webui/api}/alerts.py +1 -1
- jettask/{api/v1 → webui/api}/analytics.py +2 -2
- jettask/{api/v1 → webui/api}/namespaces.py +1 -1
- jettask/{api/v1 → webui/api}/overview.py +1 -1
- jettask/{api/v1 → webui/api}/queues.py +3 -3
- jettask/{api/v1 → webui/api}/scheduled.py +1 -1
- jettask/{api/v1 → webui/api}/settings.py +1 -1
- jettask/{api.py → webui/app.py} +253 -145
- jettask/webui/namespace_manager/__init__.py +10 -0
- jettask/{multi_namespace_consumer.py → webui/namespace_manager/multi.py} +69 -22
- jettask/{unified_consumer_manager.py → webui/namespace_manager/unified.py} +1 -1
- jettask/{run.py → webui/run.py} +2 -2
- jettask/{services → webui/services}/__init__.py +1 -3
- jettask/{services → webui/services}/overview_service.py +34 -16
- jettask/{services → webui/services}/queue_service.py +1 -1
- jettask/{backend → webui/services}/queue_stats_v2.py +1 -1
- jettask/{services → webui/services}/settings_service.py +1 -1
- jettask/worker/__init__.py +53 -0
- jettask/worker/lifecycle.py +1507 -0
- jettask/worker/manager.py +583 -0
- jettask/{core/offline_worker_recovery.py → worker/recovery.py} +268 -175
- {jettask-0.2.19.dist-info → jettask-0.2.23.dist-info}/METADATA +2 -71
- jettask-0.2.23.dist-info/RECORD +145 -0
- jettask/__main__.py +0 -140
- jettask/api/__init__.py +0 -103
- jettask/backend/__init__.py +0 -1
- jettask/backend/api/__init__.py +0 -3
- jettask/backend/api/v1/__init__.py +0 -17
- jettask/backend/api/v1/monitoring.py +0 -431
- jettask/backend/api/v1/namespaces.py +0 -504
- jettask/backend/api/v1/queues.py +0 -342
- jettask/backend/api/v1/tasks.py +0 -367
- jettask/backend/core/__init__.py +0 -3
- jettask/backend/core/cache.py +0 -221
- jettask/backend/core/database.py +0 -200
- jettask/backend/core/exceptions.py +0 -102
- jettask/backend/dependencies.py +0 -261
- jettask/backend/init_meta_db.py +0 -158
- jettask/backend/main.py +0 -1426
- jettask/backend/main_unified.py +0 -78
- jettask/backend/main_v2.py +0 -394
- jettask/backend/models/__init__.py +0 -3
- jettask/backend/models/requests.py +0 -236
- jettask/backend/models/responses.py +0 -230
- jettask/backend/namespace_api_old.py +0 -267
- jettask/backend/services/__init__.py +0 -3
- jettask/backend/start.py +0 -42
- jettask/backend/unified_api_router.py +0 -1541
- jettask/cleanup_deprecated_tables.sql +0 -16
- jettask/core/consumer_manager.py +0 -1695
- jettask/core/delay_scanner.py +0 -256
- jettask/core/event_pool.py +0 -1700
- jettask/core/heartbeat_process.py +0 -222
- jettask/core/task_batch.py +0 -153
- jettask/core/worker_scanner.py +0 -271
- jettask/executors/__init__.py +0 -5
- jettask/executors/asyncio.py +0 -876
- jettask/executors/base.py +0 -30
- jettask/executors/common.py +0 -148
- jettask/executors/multi_asyncio.py +0 -309
- jettask/gradio_app.py +0 -570
- jettask/integrated_gradio_app.py +0 -1088
- jettask/main.py +0 -0
- jettask/monitoring/__init__.py +0 -3
- jettask/pg_consumer.py +0 -1896
- jettask/run_monitor.py +0 -22
- jettask/run_webui.py +0 -148
- jettask/scheduler/multi_namespace_scheduler.py +0 -294
- jettask/scheduler/unified_manager.py +0 -450
- jettask/task_center_client.py +0 -150
- jettask/utils/serializer_optimized.py +0 -33
- jettask/webui_exceptions.py +0 -67
- jettask-0.2.19.dist-info/RECORD +0 -150
- /jettask/{constants.py → config/constants.py} +0 -0
- /jettask/{backend/config.py → config/task_center.py} +0 -0
- /jettask/{pg_consumer → messaging/pg_consumer}/pg_consumer_v2.py +0 -0
- /jettask/{pg_consumer → messaging/pg_consumer}/sql/add_execution_time_field.sql +0 -0
- /jettask/{pg_consumer → messaging/pg_consumer}/sql/create_new_tables.sql +0 -0
- /jettask/{pg_consumer → messaging/pg_consumer}/sql/create_tables_v3.sql +0 -0
- /jettask/{pg_consumer → messaging/pg_consumer}/sql/migrate_to_new_structure.sql +0 -0
- /jettask/{pg_consumer → messaging/pg_consumer}/sql/modify_time_fields.sql +0 -0
- /jettask/{pg_consumer → messaging/pg_consumer}/sql_utils.py +0 -0
- /jettask/{models.py → persistence/models.py} +0 -0
- /jettask/scheduler/{manager.py → task_crud.py} +0 -0
- /jettask/{schema.sql → schemas/schema.sql} +0 -0
- /jettask/{task_center.py → task/task_center/client.py} +0 -0
- /jettask/{monitoring → utils}/file_watcher.py +0 -0
- /jettask/{services/redis_monitor_service.py → utils/redis_monitor.py} +0 -0
- /jettask/{api/v1 → webui/api}/__init__.py +0 -0
- /jettask/{webui_config.py → webui/config.py} +0 -0
- /jettask/{webui_models → webui/models}/__init__.py +0 -0
- /jettask/{webui_models → webui/models}/namespace.py +0 -0
- /jettask/{services → webui/services}/alert_service.py +0 -0
- /jettask/{services → webui/services}/analytics_service.py +0 -0
- /jettask/{services → webui/services}/scheduled_task_service.py +0 -0
- /jettask/{services → webui/services}/task_service.py +0 -0
- /jettask/{webui_sql → webui/sql}/batch_upsert_functions.sql +0 -0
- /jettask/{webui_sql → webui/sql}/verify_database.sql +0 -0
- {jettask-0.2.19.dist-info → jettask-0.2.23.dist-info}/WHEEL +0 -0
- {jettask-0.2.19.dist-info → jettask-0.2.23.dist-info}/entry_points.txt +0 -0
- {jettask-0.2.19.dist-info → jettask-0.2.23.dist-info}/licenses/LICENSE +0 -0
- {jettask-0.2.19.dist-info → jettask-0.2.23.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,158 @@
|
|
1
|
+
"""
|
2
|
+
Redis Lua 脚本定义
|
3
|
+
|
4
|
+
集中管理所有的 Redis Lua 脚本,用于原子操作和性能优化
|
5
|
+
"""
|
6
|
+
|
7
|
+
# Lua脚本:批量处理延迟任务
|
8
|
+
# 用于批量添加延迟任务到Redis Stream和ZSET
|
9
|
+
LUA_SCRIPT_DELAYED_TASKS = """
|
10
|
+
local prefix = ARGV[1]
|
11
|
+
local current_time = tonumber(ARGV[2])
|
12
|
+
local results = {}
|
13
|
+
|
14
|
+
-- 从ARGV[3]开始,每5个参数为一组任务信息
|
15
|
+
-- [stream_key, stream_data, execute_at, delay_seconds, queue]
|
16
|
+
for i = 3, #ARGV, 5 do
|
17
|
+
local stream_key = ARGV[i]
|
18
|
+
local stream_data = ARGV[i+1]
|
19
|
+
local execute_at = tonumber(ARGV[i+2])
|
20
|
+
local delay_seconds = tonumber(ARGV[i+3])
|
21
|
+
local queue = ARGV[i+4]
|
22
|
+
|
23
|
+
-- 使用Hash存储所有队列的offset
|
24
|
+
local offsets_hash = prefix .. ':QUEUE_OFFSETS'
|
25
|
+
-- 使用HINCRBY原子递增offset
|
26
|
+
local offset = redis.call('HINCRBY', offsets_hash, queue, 1)
|
27
|
+
|
28
|
+
-- 1. 添加消息到Stream(包含offset字段)
|
29
|
+
local stream_id = redis.call('XADD', stream_key, '*',
|
30
|
+
'data', stream_data,
|
31
|
+
'offset', offset)
|
32
|
+
|
33
|
+
-- 2. 添加到延迟队列ZSET
|
34
|
+
local delayed_queue_key = prefix .. ':DELAYED_QUEUE:' .. queue
|
35
|
+
redis.call('ZADD', delayed_queue_key, execute_at, stream_id)
|
36
|
+
|
37
|
+
-- 3. 保存 stream_key 到共享Hash(所有延迟任务共享一个Hash)
|
38
|
+
local stream_key_hash = prefix .. ':TASK:STREAM_KEY'
|
39
|
+
redis.call('HSET', stream_key_hash, stream_id, stream_key)
|
40
|
+
|
41
|
+
-- 保存stream_id到结果
|
42
|
+
table.insert(results, stream_id)
|
43
|
+
end
|
44
|
+
|
45
|
+
return results
|
46
|
+
"""
|
47
|
+
|
48
|
+
# Lua脚本:批量处理普通任务
|
49
|
+
# 用于批量添加普通任务到Redis Stream
|
50
|
+
LUA_SCRIPT_NORMAL_TASKS = """
|
51
|
+
local prefix = ARGV[1]
|
52
|
+
local current_time = ARGV[2]
|
53
|
+
local results = {}
|
54
|
+
|
55
|
+
-- 从ARGV[3]开始,每2个参数为一组任务信息
|
56
|
+
-- [stream_key, stream_data]
|
57
|
+
for i = 3, #ARGV, 2 do
|
58
|
+
local stream_key = ARGV[i]
|
59
|
+
local stream_data = ARGV[i+1]
|
60
|
+
|
61
|
+
-- 从stream_key中提取队列名(格式: prefix:STREAM:queue_name)
|
62
|
+
local queue_name = string.match(stream_key, prefix .. ':STREAM:(.*)')
|
63
|
+
|
64
|
+
-- 获取并递增offset
|
65
|
+
local offset_key = prefix .. ':STREAM:' .. queue_name .. ':next_offset'
|
66
|
+
local offset = redis.call('INCR', offset_key)
|
67
|
+
|
68
|
+
-- 1. 添加消息到Stream(包含offset字段)
|
69
|
+
local stream_id = redis.call('XADD', stream_key, '*',
|
70
|
+
'data', stream_data,
|
71
|
+
'offset', offset)
|
72
|
+
|
73
|
+
-- 2. 设置任务状态Hash(只存储status)
|
74
|
+
local task_key = prefix .. ':TASK:' .. stream_id
|
75
|
+
redis.call('HSET', task_key, 'status', 'pending')
|
76
|
+
|
77
|
+
-- 3. 设置过期时间(1小时)
|
78
|
+
redis.call('EXPIRE', task_key, 3600)
|
79
|
+
|
80
|
+
-- 保存stream_id到结果
|
81
|
+
table.insert(results, stream_id)
|
82
|
+
end
|
83
|
+
|
84
|
+
return results
|
85
|
+
"""
|
86
|
+
|
87
|
+
# Lua脚本:原子获取并删除结果
|
88
|
+
# 用于获取任务结果后立即删除,避免多次读取
|
89
|
+
LUA_SCRIPT_GET_AND_DELETE = """
|
90
|
+
local key = KEYS[1]
|
91
|
+
local value = redis.call('GET', key)
|
92
|
+
if value then
|
93
|
+
redis.call('DEL', key)
|
94
|
+
end
|
95
|
+
return value
|
96
|
+
"""
|
97
|
+
|
98
|
+
# Lua脚本:批量发送任务(简化版,已被LUA_SCRIPT_NORMAL_TASKS替代)
|
99
|
+
# 保留用于兼容性
|
100
|
+
LUA_SCRIPT_BATCH_SEND = """
|
101
|
+
local stream_key = KEYS[1]
|
102
|
+
local task_name = ARGV[1]
|
103
|
+
local count = 0
|
104
|
+
|
105
|
+
for i = 2, #ARGV do
|
106
|
+
redis.call('XADD', stream_key, '*', 'task_name', task_name, 'message', ARGV[i])
|
107
|
+
count = count + 1
|
108
|
+
end
|
109
|
+
|
110
|
+
return count
|
111
|
+
"""
|
112
|
+
|
113
|
+
# Lua脚本:发送延迟任务(_send_delayed_tasks方法专用)
|
114
|
+
# 用于异步发送单个队列的延迟任务
|
115
|
+
LUA_SCRIPT_SEND_DELAYED_TASKS = """
|
116
|
+
local prefix = ARGV[1]
|
117
|
+
local results = {}
|
118
|
+
|
119
|
+
-- 从ARGV[2]开始,每3个参数为一组任务信息
|
120
|
+
-- [stream_key, stream_data, execute_at]
|
121
|
+
-- 延迟队列key直接从stream_key推导,保持队列名一致(包括优先级)
|
122
|
+
for i = 2, #ARGV, 3 do
|
123
|
+
local stream_key = ARGV[i]
|
124
|
+
local stream_data = ARGV[i+1]
|
125
|
+
local execute_at = tonumber(ARGV[i+2])
|
126
|
+
|
127
|
+
-- 使用Hash存储所有队列的offset
|
128
|
+
local offsets_hash = prefix .. ':QUEUE_OFFSETS'
|
129
|
+
|
130
|
+
-- 从stream_key中提取完整队列名(包含优先级)
|
131
|
+
local full_queue_name = string.gsub(stream_key, '^' .. prefix .. ':QUEUE:', '')
|
132
|
+
|
133
|
+
-- 使用HINCRBY原子递增offset
|
134
|
+
local current_offset = redis.call('HINCRBY', offsets_hash, full_queue_name, 1)
|
135
|
+
|
136
|
+
-- 1. 添加消息到Stream(包含offset字段)
|
137
|
+
local stream_id = redis.call('XADD', stream_key, '*',
|
138
|
+
'data', stream_data,
|
139
|
+
'offset', current_offset)
|
140
|
+
|
141
|
+
-- 2. 添加到延迟队列ZSET(延迟队列名和Stream名完全对应)
|
142
|
+
local delayed_queue_key = prefix .. ':DELAYED_QUEUE:' .. full_queue_name
|
143
|
+
redis.call('ZADD', delayed_queue_key, execute_at, stream_id)
|
144
|
+
|
145
|
+
-- 保存stream_id到结果
|
146
|
+
table.insert(results, stream_id)
|
147
|
+
end
|
148
|
+
|
149
|
+
return results
|
150
|
+
"""
|
151
|
+
|
152
|
+
__all__ = [
|
153
|
+
'LUA_SCRIPT_DELAYED_TASKS',
|
154
|
+
'LUA_SCRIPT_NORMAL_TASKS',
|
155
|
+
'LUA_SCRIPT_GET_AND_DELETE',
|
156
|
+
'LUA_SCRIPT_BATCH_SEND',
|
157
|
+
'LUA_SCRIPT_SEND_DELAYED_TASKS',
|
158
|
+
]
|
jettask/config/nacos_config.py
CHANGED
@@ -10,18 +10,24 @@ import json
|
|
10
10
|
import yaml
|
11
11
|
import threading
|
12
12
|
from datetime import datetime
|
13
|
-
from typing import Dict, Any, Callable, List
|
13
|
+
from typing import Dict, Any, Callable, List, Optional
|
14
14
|
from dotenv import load_dotenv
|
15
15
|
from nacos import NacosClient
|
16
16
|
import logging
|
17
|
+
try:
|
18
|
+
from urllib.request import Request, urlopen
|
19
|
+
from urllib.parse import urlencode
|
20
|
+
except ImportError:
|
21
|
+
from urllib2 import Request, urlopen
|
22
|
+
from urllib import urlencode
|
17
23
|
|
18
24
|
|
19
25
|
|
20
26
|
logger = logging.getLogger(__name__)
|
21
27
|
|
22
28
|
|
23
|
-
class
|
24
|
-
"""
|
29
|
+
class NacosConfigLoader:
|
30
|
+
"""Nacos 配置加载器类,支持定时刷新和配置监听"""
|
25
31
|
|
26
32
|
def __init__(self, refresh_interval: int = 30):
|
27
33
|
"""初始化配置管理器
|
@@ -275,7 +281,6 @@ class Config:
|
|
275
281
|
redis_url = f"redis://:{redis_password}@{redis_host}:{redis_port}/{redis_db}"
|
276
282
|
else:
|
277
283
|
redis_url = f"redis://{redis_host}:{redis_port}/{redis_db}"
|
278
|
-
print(f'{redis_url=}')
|
279
284
|
return redis_url
|
280
285
|
|
281
286
|
def get(self, key, default=None):
|
@@ -396,6 +401,128 @@ class Config:
|
|
396
401
|
'local_dev_mode': self.local_dev_mode,
|
397
402
|
'config_items_count': len(self._config) if self._config else 0
|
398
403
|
}
|
404
|
+
|
405
|
+
def get_namespaces(self) -> Optional[List[Dict[str, Any]]]:
|
406
|
+
"""从 Nacos 获取所有命名空间列表
|
407
|
+
|
408
|
+
Returns:
|
409
|
+
命名空间列表,每个元素包含:
|
410
|
+
- namespace: 命名空间ID
|
411
|
+
- namespaceShowName: 命名空间显示名称
|
412
|
+
- namespaceDesc: 命名空间描述
|
413
|
+
- quota: 配额
|
414
|
+
- configCount: 配置数量
|
415
|
+
- type: 类型 (0: Global, 1: Default Private, 2: Custom)
|
416
|
+
|
417
|
+
如果获取失败返回 None
|
418
|
+
|
419
|
+
Example:
|
420
|
+
>>> config = Config()
|
421
|
+
>>> namespaces = config.get_namespaces()
|
422
|
+
>>> for ns in namespaces:
|
423
|
+
... print(f"{ns['namespaceShowName']} ({ns['namespace']})")
|
424
|
+
"""
|
425
|
+
if not self.nacos_config:
|
426
|
+
logger.error("Nacos配置未初始化")
|
427
|
+
return None
|
428
|
+
|
429
|
+
try:
|
430
|
+
# 构建请求URL
|
431
|
+
server_addr = self.nacos_config['server_addresses']
|
432
|
+
if not server_addr.startswith('http'):
|
433
|
+
server_addr = f'http://{server_addr}'
|
434
|
+
|
435
|
+
# 使用 Nacos v2 API
|
436
|
+
url = f"{server_addr}/nacos/v2/console/namespace/list"
|
437
|
+
|
438
|
+
logger.info(f"正在从 Nacos 获取命名空间列表: {url}")
|
439
|
+
|
440
|
+
# 构建认证参数
|
441
|
+
params = {}
|
442
|
+
if self.nacos_config.get('username') and self.nacos_config.get('password'):
|
443
|
+
# 注意:某些 Nacos 版本可能需要先获取 accessToken
|
444
|
+
# 这里使用基本认证
|
445
|
+
params['username'] = self.nacos_config['username']
|
446
|
+
params['password'] = self.nacos_config['password']
|
447
|
+
|
448
|
+
# 添加参数到URL
|
449
|
+
if params:
|
450
|
+
url = f"{url}?{urlencode(params)}"
|
451
|
+
|
452
|
+
# 发送HTTP请求
|
453
|
+
req = Request(url)
|
454
|
+
req.add_header('User-Agent', 'JetTask-NacosClient/1.0')
|
455
|
+
|
456
|
+
with urlopen(req, timeout=10) as response:
|
457
|
+
response_data = response.read().decode('utf-8')
|
458
|
+
result = json.loads(response_data)
|
459
|
+
|
460
|
+
# 检查响应
|
461
|
+
if result.get('code') == 0 or result.get('code') == 200:
|
462
|
+
namespaces = result.get('data', [])
|
463
|
+
logger.info(f"成功获取 {len(namespaces)} 个命名空间")
|
464
|
+
logger.debug(f"命名空间列表: {namespaces}")
|
465
|
+
return namespaces
|
466
|
+
else:
|
467
|
+
logger.error(f"获取命名空间失败: {result.get('message', 'Unknown error')}")
|
468
|
+
return None
|
469
|
+
|
470
|
+
except Exception as e:
|
471
|
+
logger.error(f"获取命名空间列表异常: {e}", exc_info=True)
|
472
|
+
return None
|
473
|
+
|
474
|
+
def get_namespace_configs(self, namespace_id: str, group: str = None) -> Optional[Dict[str, Any]]:
|
475
|
+
"""获取指定命名空间的配置
|
476
|
+
|
477
|
+
Args:
|
478
|
+
namespace_id: 命名空间ID
|
479
|
+
group: 配置组,默认使用当前配置的group
|
480
|
+
|
481
|
+
Returns:
|
482
|
+
配置字典,失败返回 None
|
483
|
+
"""
|
484
|
+
if not self.nacos_config:
|
485
|
+
logger.error("Nacos配置未初始化")
|
486
|
+
return None
|
487
|
+
|
488
|
+
try:
|
489
|
+
# 创建临时客户端连接到指定命名空间
|
490
|
+
temp_client = NacosClient(
|
491
|
+
self.nacos_config['server_addresses'],
|
492
|
+
namespace=namespace_id,
|
493
|
+
username=self.nacos_config['username'],
|
494
|
+
password=self.nacos_config['password']
|
495
|
+
)
|
496
|
+
|
497
|
+
# 使用指定的group或默认group
|
498
|
+
target_group = group or self.nacos_group
|
499
|
+
|
500
|
+
# 获取配置
|
501
|
+
config_str = temp_client.get_config(self.nacos_data_id, target_group)
|
502
|
+
|
503
|
+
if not config_str:
|
504
|
+
logger.warning(f"命名空间 {namespace_id} 的配置为空")
|
505
|
+
return {}
|
506
|
+
|
507
|
+
# 解析配置(支持 Properties、YAML 和 JSON)
|
508
|
+
if self._is_properties_format(config_str):
|
509
|
+
config = self._parse_properties(config_str)
|
510
|
+
else:
|
511
|
+
try:
|
512
|
+
config = yaml.safe_load(config_str)
|
513
|
+
except:
|
514
|
+
try:
|
515
|
+
config = json.loads(config_str)
|
516
|
+
except:
|
517
|
+
logger.error(f"无法解析命名空间 {namespace_id} 的配置格式")
|
518
|
+
return None
|
519
|
+
|
520
|
+
logger.info(f"成功获取命名空间 {namespace_id} 的配置,包含 {len(config)} 个配置项")
|
521
|
+
return config
|
522
|
+
|
523
|
+
except Exception as e:
|
524
|
+
logger.error(f"获取命名空间 {namespace_id} 配置异常: {e}", exc_info=True)
|
525
|
+
return None
|
399
526
|
|
400
527
|
def __del__(self):
|
401
528
|
"""析构函数,确保线程正确关闭"""
|
@@ -403,4 +530,4 @@ class Config:
|
|
403
530
|
|
404
531
|
|
405
532
|
# 创建全局配置实例(默认30秒刷新一次)
|
406
|
-
config =
|
533
|
+
config = NacosConfigLoader(refresh_interval=30)
|
jettask/core/__init__.py
CHANGED