This commit is contained in:
Your Name
2026-04-22 14:13:21 +08:00
parent e0406b5d0e
commit 7cbde2aa78
145 changed files with 23086 additions and 2243 deletions

View File

@@ -10,6 +10,7 @@ from app.services.juming_service import TaskStoppedError, crawl_juming
_JUMING_TASK_LOCK = threading.Lock()
_MAX_LOG_LINES = 400
_ACTIVE_TASK_IDS: set[str] = set()
def _now() -> str:
@@ -17,6 +18,7 @@ def _now() -> str:
def list_juming_tasks() -> list[dict]:
_cleanup_orphaned_tasks()
return load_juming_records()
@@ -55,6 +57,43 @@ def _is_stop_requested(task_id: str) -> bool:
return bool(target and target.get("cancel_requested"))
def _cleanup_orphaned_tasks() -> None:
with _JUMING_TASK_LOCK:
tasks = load_juming_records()
changed = False
for item in tasks:
status = str(item.get("status") or "").strip()
task_id = str(item.get("task_id") or "").strip()
if status == "running" and task_id and task_id not in _ACTIVE_TASK_IDS:
item["status"] = "failed"
item["phase"] = "failed"
item["phase_label"] = "失败"
item["cancel_requested"] = False
item["message"] = "任务因服务重启或进程中断而终止,请重新执行"
item["updated_at"] = _now()
logs = list(item.get("logs") or [])
logs.append(f"[{_now()}] 任务因服务重启或进程中断而终止,请重新执行")
item["logs"] = logs[-_MAX_LOG_LINES:]
changed = True
if changed:
_save_tasks(tasks)
def _ensure_no_active_task() -> None:
_cleanup_orphaned_tasks()
tasks = load_juming_records()
active = next(
(
item
for item in tasks
if str(item.get("status") or "").strip() == "running"
),
None,
)
if active:
raise ValueError(f"已有聚名采集任务正在运行:{active.get('task_id')}")
def _set_phase(task_id: str, phase: str, message: str | None = None) -> None:
phase_labels = {
"queued": "排队中",
@@ -78,12 +117,18 @@ def _set_phase(task_id: str, phase: str, message: str | None = None) -> None:
def _log_and_track_phase(task_id: str, message: str) -> None:
if "开始采集" in message or "正在抓取" in message:
_set_phase(task_id, "fetching", message)
elif "开始入库处理" in message or "入库完成" in message or "已存在域名" in message:
elif (
"开始入库处理" in message
or "入库进度" in message
or "入库完成" in message
or "已存在域名" in message
):
_set_phase(task_id, "importing", message)
_append_log(task_id, message)
def _run_juming_task(task_id: str, payload: dict) -> None:
_ACTIVE_TASK_IDS.add(task_id)
_update_task(task_id, status="running", started_at=_now(), message="聚名采集任务开始执行", cancel_requested=False)
_set_phase(task_id, "starting", "聚名采集任务开始执行")
_append_log(task_id, "任务已启动,正在准备读取聚名登录态")
@@ -127,9 +172,12 @@ def _run_juming_task(task_id: str, payload: dict) -> None:
)
_set_phase(task_id, "failed")
_append_log(task_id, f"任务执行失败:{exc}")
finally:
_ACTIVE_TASK_IDS.discard(task_id)
def create_juming_task(payload: dict) -> dict:
_ensure_no_active_task()
task_id = uuid4().hex
mode = str(payload.get("mode") or "delete_list").strip() or "delete_list"
record = {
@@ -154,12 +202,14 @@ def create_juming_task(payload: dict) -> dict:
tasks.insert(0, record)
_save_tasks(tasks)
_ACTIVE_TASK_IDS.add(task_id)
worker = threading.Thread(target=_run_juming_task, args=(task_id, dict(payload or {})), daemon=True)
worker.start()
return record
def retry_juming_task(task_id: str) -> dict:
_ensure_no_active_task()
with _JUMING_TASK_LOCK:
tasks = load_juming_records()
target = next((item for item in tasks if item["task_id"] == task_id), None)