支持更新task,当task信息改变时

This commit is contained in:
konjacpotato
2025-11-18 20:23:04 +08:00
parent ca39d1f891
commit 200550b4f8

View File

@ -65,6 +65,30 @@ def execute_task(task: callable):
# 从数据库加载任务
def load_tasks(scheduler: BlockingScheduler):
def build_db_signature(db_task) -> str:
t = (db_task.trigger or "").lower()
if t == "interval":
sec = int(db_task.interval_seconds or 0)
return f"{db_task.task_name}#interval:seconds={sec}"
if t == "cron":
expr = (db_task.cron_expression or "").strip()
parts = expr.split()
# 规范化:确保 7 个字段,替换 Quartz 的 '?' 为 '*'
if len(parts) == 7:
if parts[5] == '?':
parts[5] = '*'
expr = " ".join(parts)
return f"{db_task.task_name}#cron:{expr}"
if t == "date":
run_date = db_task.execution_date
if isinstance(run_date, datetime):
return f"{db_task.task_name}#date:{run_date.isoformat()}"
try:
return f"{db_task.task_name}#date:{str(run_date)}"
except Exception:
return f"{db_task.task_name}#date:invalid"
return f"{db_task.task_name}#unknown:{t}"
with get_session() as db:
tasks = get_tasks_by_executor(db, config.scheduler_name)
for db_task in tasks:
@ -86,6 +110,15 @@ def load_tasks(scheduler: BlockingScheduler):
task_callable = partial(func, db_task)
task_function = partial(execute_task, task_callable)
# 计算数据库中当前任务的签名
signature = build_db_signature(db_task)
job = scheduler.get_job(str(task_id))
# 如果任务已经存在并且签名相同,则跳过更新
if job and getattr(job, "name", None) == signature:
log(f"Task {db_task.task_name} (id={task_id}) already scheduled and unchanged, skipping.")
continue
try:
if trigger == "interval":
scheduler.add_job(
@ -93,7 +126,8 @@ def load_tasks(scheduler: BlockingScheduler):
"interval",
seconds=interval_seconds or 0,
id=str(task_id),
replace_existing=True
replace_existing=True,
name=signature
)
log(f"Task {db_task.task_name} added/updated with interval {interval_seconds} seconds")
@ -117,7 +151,8 @@ def load_tasks(scheduler: BlockingScheduler):
day_of_week=fields[5],
year=fields[6],
id=str(task_id),
replace_existing=True
replace_existing=True,
name=signature
)
log(f"Task {db_task.task_name} added/updated with cron {db_task.cron_expression}")
@ -139,7 +174,8 @@ def load_tasks(scheduler: BlockingScheduler):
"date",
run_date=run_date,
id=str(task_id),
replace_existing=True
replace_existing=True,
name=signature
)
log(f"Task {db_task.task_name} added/updated with date {run_date}")