Files
insistence 726883f68a feat: 新增跨时区支持并完善定时任务调度 (#127)
* feat: 新增跨时区支持

* perf: 优化代码

* fix: 修复测试

* perf: 优化调度器日志打印
2026-09-12 17:01:05 +08:00

84 lines
4.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from sqlalchemy import (
CHAR,
JSON,
BigInteger,
Boolean,
CheckConstraint,
Column,
Index,
Integer,
String,
UniqueConstraint,
)
from common.mixin import AuditTimeMixin, CreateTimeMixin
from common.types import DbUtcDateTime
from config.database import Base
class SysJob(AuditTimeMixin, Base):
"""
定时任务调度表
"""
__tablename__ = 'sys_job'
__table_args__ = (
UniqueConstraint('job_group', 'job_name', name='uq_job_group_name'),
CheckConstraint('max_instances >= 1', name='ck_job_max_instances'),
CheckConstraint('misfire_grace_time IS NULL OR misfire_grace_time >= 1', name='ck_job_misfire_grace'),
{'comment': '定时任务调度表'},
)
job_id = Column(BigInteger, primary_key=True, nullable=False, autoincrement=True, comment='任务ID')
job_name = Column(String(64), nullable=False, comment='任务名称(同一业务分组内唯一)')
job_group = Column(String(64), nullable=False, server_default='default', comment='业务分组')
job_store = Column(String(64), nullable=False, server_default='default', comment='调度存储')
job_executor = Column(String(64), nullable=True, server_default='default', comment='任务执行器')
invoke_target = Column(String(500), nullable=False, comment='调用目标字符串')
job_args = Column(JSON, nullable=False, default=list, comment='位置参数(JSON数组)')
job_kwargs = Column(JSON, nullable=False, default=dict, comment='关键字参数(JSON对象)')
cron_expression = Column(String(255), nullable=True, server_default="''", comment='cron执行表达式')
time_zone = Column(String(64), nullable=False, comment='cron时区(IANA')
misfire_grace_time = Column(
Integer().evaluates_none(), nullable=True, default=1, comment='允许延迟秒数,NULL表示不限'
)
coalesce = Column(Boolean, nullable=False, default=False, comment='积压时是否只执行最近一次')
max_instances = Column(Integer, nullable=False, server_default='1', comment='任务最大并发数')
status = Column(CHAR(1), nullable=False, server_default='1', comment='状态(0正常 1暂停)')
create_by = Column(String(64), nullable=True, server_default="''", comment='创建者')
update_by = Column(String(64), nullable=True, server_default="''", comment='更新者')
remark = Column(String(500), nullable=True, server_default="''", comment='备注信息')
class SysJobLog(CreateTimeMixin, Base):
"""
定时任务调度日志表
"""
__tablename__ = 'sys_job_log'
__table_args__ = (
Index('ix_job_log_job_id', 'job_id', 'create_time'),
Index('ix_job_log_execution_id', 'execution_id'),
{'comment': '定时任务调度日志表'},
)
job_log_id = Column(BigInteger, primary_key=True, nullable=False, autoincrement=True, comment='任务日志ID')
job_id = Column(BigInteger, nullable=True, comment='逻辑任务ID,历史未关联日志可为空')
execution_id = Column(String(32), nullable=True, comment='执行ID,历史未关联日志可为空')
job_name = Column(String(64), nullable=False, comment='任务名称')
job_group = Column(String(64), nullable=False, comment='任务组名')
job_store = Column(String(64), nullable=True, comment='调度存储快照')
job_executor = Column(String(64), nullable=False, comment='任务执行器')
invoke_target = Column(String(500), nullable=False, comment='调用目标字符串')
job_args = Column(JSON, nullable=True, comment='位置参数快照(JSON数组)')
job_kwargs = Column(JSON, nullable=True, comment='关键字参数快照(JSON对象)')
job_trigger = Column(String(255), nullable=True, server_default="''", comment='任务触发器')
time_zone = Column(String(64), nullable=True, comment='任务时区快照(IANA')
job_message = Column(String(500), nullable=True, comment='日志信息')
status = Column(CHAR(1), nullable=True, server_default='0', comment='执行状态(0正常 1失败)')
exception_info = Column(String(2000), nullable=True, server_default="''", comment='异常信息')
scheduled_time = Column(DbUtcDateTime(), nullable=True, comment='计划执行时刻')
start_time = Column(DbUtcDateTime(), nullable=True, comment='执行开始时间')
end_time = Column(DbUtcDateTime(), nullable=True, comment='执行结束时间')
run_duration_ms = Column(BigInteger, nullable=True, comment='实际执行耗时(毫秒)')