侧边栏壁纸
博主头像
学习笔记

行动起来,活在当下

  • 累计撰写 9 篇文章
  • 累计创建 2 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

在 Python 中使用 XXL-JOB 执行器的完整指南

brian
2025-11-22 / 0 评论 / 0 点赞 / 4 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

简介

pyxxl 是一个 XXL-JOB 的 Python 执行器实现,可以将 Python 函数注册到 XXL-JOB 调度中心,通过 XXL-JOB-ADMIN 统一管理 Python 定时任务和周期任务。

项目基于 XXL-JOB 提供的 RESTful API 实现,已适配 XXL-JOB 2.2.0 ~ 3.3.2 版本,支持 Python 3.9+

📦 GitHub 地址:https://github.com/fcfangcc/pyxxl

主要特性

  • ✅ 执行器自动注册到 XXL-JOB-ADMIN

  • ✅ 使用装饰器注册任务(类似 Flask 路由风格)

  • ✅ 任务生命周期管理(启动、取消、完成回调)

  • ✅ 支持全部阻塞策略(串行、丢弃、覆盖)

  • ✅ 异步任务(推荐)和同步任务双模式支持

  • ✅ 在 XXL-JOB 管理界面查看执行日志

  • ✅ 支持 Prometheus 监控指标(需安装 metrics 扩展)

  • ✅ 支持从 .env 文件或环境变量读取配置

1. 安装

根据实际需求选择安装方式:

# 基础安装
pip install pyxxl

# 日志写入 Redis
pip install "pyxxl[redis]"

# 从 .env 文件加载配置
pip install "pyxxl[dotenv]"

# 安装全部功能
pip install "pyxxl[all]"

# Prometheus 监控指标
pip install "pyxxl[metrics]"

2. 快速开始

基础使用示例

import asyncio
from pyxxl import ExecutorConfig, PyxxlRunner

# 配置执行器
config = ExecutorConfig(
    xxl_admin_baseurl="http://localhost:8080/xxl-job-admin/api/",
    executor_app_name="xxl-job-executor-sample"
)

app = PyxxlRunner(config)

# 注册异步任务(推荐)
@app.register(name="demoJobHandler")
async def test_task():
    await asyncio.sleep(5)
    return "执行成功"

# 注册同步任务(适合未全异步化的代码)
@app.register(name="syncJobHandler")
def sync_task():
    return "同步任务执行成功"

if __name__ == "__main__":
    app.run_executor()

3. ExecutorConfig 配置说明

ExecutorConfig 是执行器的核心配置类,支持以下参数:

参数

类型

必填

说明

xxl_admin_baseurl

str

✅ 是

XXL-JOB-Admin API 地址,如 http://host:8080/xxl-job-admin/api/

executor_app_name

str

✅ 是

执行器在 Admin 中注册的应用名称,需与 Admin 中配置一致

executor_listen_host

str

❌ 否

执行器监听地址,Admin 无法直连时需手动指定,默认取第一个网卡地址

executor_listen_port

int

❌ 否

执行器监听端口,默认随机分配

debug

bool

❌ 否

调试模式,开启后输出更详细的日志,默认 False

完整配置示例:

from pyxxl import ExecutorConfig

config = ExecutorConfig(
    xxl_admin_baseurl="http://localhost:8080/xxl-job-admin/api/",
    executor_app_name="xxl-job-executor-sample",
    executor_listen_host="192.168.1.100",  # 指定可被 Admin 访问的 IP
    executor_listen_port=9999,
    debug=True,
)

4. 异步任务 vs 同步任务

异步任务(推荐)

如果你的业务代码已经全面异步化,优先使用异步任务,可以充分利用协程的并发优势:

@app.register(name="asyncJobHandler")
async def async_task():
    # 调用异步 IO 操作
    await some_async_operation()
    return "异步执行完成"

同步任务

同步任务运行在线程池中,适合无法异步化的传统代码。但需注意:同步任务默认不支持超时和取消信号,如需支持,需要在任务函数中主动检测 g.cancel_event

import time
from pyxxl import g

@app.register(name="syncLoopHandler")
def sync_loop_task():
    task_list = get_pending_tasks()
    while not g.cancel_event.is_set() and task_list:
        task = task_list.pop()
        process(task)
        time.sleep(1)
    return "处理完成"

⚠️ 如果你的同步任务没有实现全异步,直接使用同步函数,否则会阻塞其他任务的执行。

5. 任务参数

XXL-JOB 在调度时可以传递任务参数(executorParam),在 Python 函数中通过 g.job_idg.param 获取:

from pyxxl import g

@app.register(name="paramJobHandler")
async def param_task():
    # 获取任务 ID 和参数
    job_id = g.job_id
    param = g.param  # XXL-JOB 界面填写的任务参数
    print(f"任务ID: {job_id}, 参数: {param}")
    return "OK"

6. Prometheus 监控

安装 metrics 扩展后,执行器会自动暴露 Prometheus 格式的指标:

pip install "pyxxl[metrics]"

访问地址:

http://<executor_listen_host>:<executor_listen_port>/metrics

可通过 Prometheus + Grafana 监控任务执行次数、成功率、耗时等核心指标。

7. 开发与调试

项目提供了一键启动开发环境的脚本(依赖 Docker):

# 启动 XXL-JOB 调度中心(默认 http://127.0.0.1:8080/xxl-job-admin/)
./init_dev_env.sh

# 安装依赖并启动示例执行器
uv sync --all-extras
python example/executor_app.py

XXL-JOB-Admin 默认账号密码:admin / 123456

兼容性

  • Python 版本:3.9+(0.3.0 为最后一个支持 Python 3.8 的版本)

  • XXL-JOB 版本:已测试适配 2.2.0、2.3.0、2.4.0、3.3.2

已知问题

  1. XXL-JOB 界面显示的任务执行时间为回调时间,而非实际开始时间(属于 XXL-JOB 解析层面的问题)

  2. 实时日志拉取进度显示异常,刷新页面后可查看完整日志

参考资料

博主关闭了所有页面的评论