Skip to content

定时任务

定时任务模块基于 APScheduler 实现,支持 Cron 表达式调度、任务执行日志、动态启停等功能。包含 job(任务定义)、job_log(执行日志)、scheduler(调度器)三个子模块。

模块结构

src/modules/job/
├── models.py       # 任务模型
├── schemas.py      # 表单验证
├── repository.py   # 数据访问层
├── service.py      # 业务逻辑层
├── scheduler.py    # 调度器管理
└── job_executor.py # 任务执行器

src/modules/job_log/
├── models.py       # 执行日志模型
├── repository.py   # 日志数据访问
└── service.py      # 日志业务逻辑

任务模型

python
# src/modules/job/models.py
# ============================================================
# 定时任务模型
# ============================================================
class Job(base_model, base_db):
    """定时任务模型类"""
    # ============================================================
    # 表名配置
    # ============================================================
    __tablename__ = DB_PREFIX + "job"
    __table_comment__ = "定时任务表"

    # ============================================================
    # 字段定义
    # ============================================================
    # 任务名称
    job_name = Column(String(255), nullable=False, index=True, comment="任务名称")
    # 任务别名
    job_alias = Column(String(255), nullable=True, comment="任务别名")
    # 任务分组
    job_group = Column(String(255), nullable=True, comment="任务分组")
    # 任务触发器
    job_trigger = Column(String(255), nullable=True, comment="任务触发器")
    # 任务状态:0-未发布 1-运行中 2-暂停 3-删除
    status = Column(Integer, nullable=False, default=0, server_default=text('0'), index=True,
                    comment="任务状态:0-未发布 1-运行中 2-暂停 3-删除")
    # Cron表达式
    cron_expression = Column(String(255), nullable=True, comment="Cron表达式")
    # 执行策略:1-立即执行 2-执行一次 3-放弃执行
    execute_policy = Column(Integer, nullable=False, default=1, server_default=text('1'),
                            comment="执行策略:1-立即执行 2-执行一次 3-放弃执行")
    # 是否同步任务:0-否 1-是
    is_sync = Column(Integer, nullable=False, default=0, server_default=text('0'), comment="是否同步任务:0-否 1-是")
    # 任务URL
    url = Column(String(255), nullable=True, comment="任务URL")
    # 任务参数
    params = Column(Text, nullable=True, comment="任务参数")
    # 任务备注
    note = Column(String(255), nullable=True, comment="任务备注")

    # ============================================================
    # 内置方法
    # ============================================================
    def __str__(self):
        """返回任务名称作为字符串表示"""
        return "定时任务:{}".format(self.job_name)

执行日志模型

python
# src/modules/job_log/models.py
# ============================================================
# 定时任务日志模型
# ============================================================
class JobLog(base_model, base_db):
    """定时任务日志模型类"""
    # ============================================================
    # 表名配置
    # ============================================================
    __tablename__ = DB_PREFIX + "job_log"
    __table_comment__ = "定时任务日志表"

    # ============================================================
    # 字段定义
    # ============================================================
    # 任务ID
    job_id = Column(Integer, nullable=False, default=0, server_default=text('0'), index=True, comment="任务ID")
    # 任务名称
    job_name = Column(String(255), nullable=False, comment="任务名称")
    # 任务分组
    job_group = Column(String(255), nullable=True, comment="任务分组")
    # 任务触发器
    job_trigger = Column(String(255), nullable=True, comment="任务触发器")
    # 任务日志信息
    job_message = Column(String(500), nullable=True, comment="任务日志信息")
    # Cron表达式
    cron_expression = Column(String(255), nullable=True, comment="Cron表达式")
    # 执行状态:0-正常 1-失败
    status = Column(Integer, nullable=False, default=0, server_default=text('0'), index=True, comment="执行状态:0-正常 1-失败")
    # 执行开始时间
    start_time = Column(DateTime, nullable=True, comment="执行开始时间")
    # 执行结束时间
    end_time = Column(DateTime, nullable=True, comment="执行结束时间")
    # 执行耗时,单位:毫秒
    consume_time = Column(BigInteger, nullable=False, default=0, server_default=text('0'), comment="执行耗时,单位:毫秒")
    # 异常信息
    exception_info = Column(Text, nullable=True, comment="异常信息")

    # ============================================================
    # 内置方法
    # ============================================================
    def __str__(self):
        """返回任务名称作为字符串表示"""
        return "定时任务日志:{}".format(self.job_name)

调度器管理

python
# src/modules/job/scheduler.py
from apscheduler.schedulers.asyncio import AsyncIOScheduler

scheduler = AsyncIOScheduler()

def init_scheduler():
    """启动时加载所有启用的任务"""
    jobs = job_repo.get_all(status=0)
    for job in jobs:
        add_job(job)
    return len(jobs)

def add_job(job):
    """添加任务到调度器"""
    scheduler.add_job(
        func=execute_job,
        trigger='cron',
        id=str(job.id),
        args=[job.id],
        **parse_cron(job.cron_expression),
    )

def shutdown_scheduler():
    """关闭调度器"""
    scheduler.shutdown()

生命周期

调度器在应用启动时初始化(_combined_lifespan),加载所有状态为"运行"的任务。应用关闭时自动停止调度器。

Cron 表达式

字段允许值允许的特殊字符
0-59, - * /
0-59, - * /
0-23, - * /
1-31, - * /
1-12, - * /
0-7, - * /

常用示例:

0 0/5 * * * ? 每5分钟执行
0 0 2 * * ? 每天凌晨2点执行
0 0 0 1 * ? 每月1号零点执行
0 0 * * * ? 每小时执行

API 接口

接口方法权限节点说明
/api/v1/job/listGETsys:job:list任务列表
/api/v1/job/addPOSTsys:job:add新增任务
/api/v1/job/updatePUTsys:job:update编辑任务
/api/v1/job/delete/{id}DELETEsys:job:delete删除任务
/api/v1/job/statusPUTsys:job:status启停任务
/api/v1/job/runPOSTsys:job:run立即执行
/api/v1/jobLog/listGETsys:jobLog:list执行日志

总结

定时任务模块具备以下特点:

1. APScheduler:基于成熟的调度框架,支持 Cron 表达式
2. 动态管理:通过接口动态添加、修改、启停任务
3. 执行日志:自动记录每次执行的开始时间、耗时、状态、异常
4. 并发控制:可配置是否允许并发执行
5. 错过策略:配置错过执行时的处理策略
6. 生命周期:应用启动自动加载,关闭自动停止

小蚂蚁云团队 · 提供技术支持