d
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user