XXL-JOB - 集成 Python 执行器实战指南

1. 前言

在分布式系统中,XXL-JOB 是非常主流的 Java 任务调度平台。但在实际业务中,我们经常需要运行一些 Python 任务(如数据分析、AI 模型推理等)。本文将介绍如何通过开源库 pyxxl 快速实现 Python 与 XXL-JOB 的无缝对接,并重点讲解如何处理"每小时触发且自动覆盖旧任务"的调度逻辑。

2. 环境准备

在开始之前,请确保已安装以下环境:

  • XXL-JOB Admin: 2.x 以上版本

https://github.com/xuxueli/xxl-jobhttps://github.com/xuxueli/xxl-job

  • Python: 3.10+
  • pyxxl: 核心集成库
bash 复制代码
pip install pyxxl

3. 快速上手:编写 Python 执行器

我们使用 pyxxl 编写一个简单的执行器。其核心原理是启动一个长驻内存的异步服务,监听指定端口并等待调度中心(Admin)的指令。

3.1 核心代码逻辑 app.py

python 复制代码
import asyncio
from pyxxl import ExecutorConfig, PyxxlRunner
from pyxxl.ctx import g

# 1. 配置执行器参数
config = ExecutorConfig(
    # 调度中心地址,注意末尾通常需要 /api/
    xxl_admin_baseurl="http://127.0.0.1:8080/xxl-job-admin/api/",
    # 执行器名称,必须与 XXL-JOB 调度中心里配置的 AppName 一致
    executor_app_name="python-executor",
    # 本机监听 IP(调度中心需要能访问到这个 IP)
    executor_listen_host="127.0.0.1",
    # 本机监听端口
    executor_listen_port=9999,
    # 调度中心配置的 AccessToken
    access_token="default_token",
)

# 2. 初始化运行器
app = PyxxlRunner(config)

# 3. 注册任务 (JobHandler)
@app.register(name="simple_python_job")
async def simple_job():
    """
    获取参数并在控制台/调度中心打印日志
    """
    # 从全局对象 g 中获取调度中心传来的参数
    params = g.xxl_run_data.executor_params

    # 使用 g.logger 打印日志,这些日志会实时同步给 XXL-JOB 控制台
    g.logger.info("--- 任务开始运行 ---")
    g.logger.info(f"接收到的参数内容为: {params}")

    # 模拟业务耗时操作
    await asyncio.sleep(2)

    g.logger.info("--- 任务处理完成 ---")

    # 返回字符串作为任务执行结果
    return f"任务执行成功,参数是: {params}"

if __name__ == "__main__":
    print("Python XXL-JOB 执行器已启动,等待调度...")
    app.run_executor() # 启动执行器服务

4. 部署与维护脚本

为了保证 Python 执行器作为后台服务稳定运行,我们编写一个 Shell 脚本进行启停管理。

4.1 run_job.sh 启动脚本

该脚本会自动清理旧的执行器进程,激活 Conda 环境并启动新服务。

python 复制代码
#!/bin/bash

# 配置区
PYTHON_SCRIPT="/opt/xxl_job/app.py"
LOG_FILE="/opt/xxl_job/executor.log"
LISTEN_PORT=9999
CONDA_ENV_NAME="your_env"

# 1. 环境初始化
eval "$(/root/miniconda3/bin/conda shell.bash hook)"
conda activate $CONDA_ENV_NAME

# 2. 停止旧实例
OLD_PID=$(lsof -t -i:$LISTEN_PORT)
if [ -n "$OLD_PID" ]; then
    kill -9 $OLD_PID
    sleep 2
fi

# 3. 启动新实例
# -u 禁用缓冲,确保日志实时写入;>> 重定向避免产生 nohup.out
nohup python -u "$PYTHON_SCRIPT" >> "$LOG_FILE" 2>&1 &

echo "XXL-JOB 执行器启动成功,PID: $!"

PS:没有安装conda环境,可直接运行py脚本

5. XXL-JOB 后台配置指南

启动 Python 服务后,需要在 XXL-JOB 管理后台进行配置。

5.1 执行器管理

  • AppName : 必须填写 python-executor(与代码中一致)。

  • 注册方式: 自动注册。

5.2 任务管理(核心关键)

针对"每小时执行且确保任务最新"的场景,配置细节如下:

  • JobHandler : 填写代码中注册的 simple_python_job

  • Cron : 0/10 * * * * ? (每10秒触发)。

  • 阻塞处理策略 : 覆盖之前调度(这是实现自动杀掉前一次旧任务的关键)。

6. 注意事项

  1. CancelledError : 当"覆盖之前调度"生效时,旧任务会在 await 处抛出 asyncio.exceptions.CancelledError。这是 XXL-JOB 强制终止旧逻辑的正常反馈,无需惊慌。

  2. 日志原理 : pyxxl 采用"本地磁盘持久化 + Admin 按需读取"的架构。详细日志并不存入数据库,因此不会对数据库产生写压力。

  3. 超时时间: 建议设置合理的任务超时时间(非 0),防止进程陷入死循环。

相关推荐
宝贝儿好43 分钟前
【强化学习实战】第十一章:Gymnasium库的介绍和使用(1)、出租车游戏代码详解(Sarsa & Q learning)
人工智能·python·深度学习·算法·游戏·机器学习
程序媛一枚~4 小时前
✨✨✨使用Python,OpenCV及图片拼接生成❤️LOVE❤️字样图,每张小图加随机颜色边框,大图加随机大小随机颜色边框
图像处理·python·opencv·numpy·图像拼接
jyfool4 小时前
Ubuntu 远程桌面配置踩坑实录:从 TightVNC 到 x11vnc 的折腾之旅
linux·运维·ubuntu
MediaTea4 小时前
Python:collections.Counter 常用函数及应用
开发语言·python
如若1234 小时前
flash-attn 安装失败?从报错到成功的完整排雷指南(CUDA 12.8 + PyTorch 2.7)
人工智能·pytorch·python
007张三丰4 小时前
知乎高赞回答爬虫:从零开始,建立你的专属知识库
爬虫·python·知识库·python爬虫·知乎·高赞回答
安当加密4 小时前
基于 RADIUS 的 Linux 服务器双因子认证:从 FreeRADIUS 到轻量级 ASP 方案的演进
linux·运维·服务器
李昊哲小课5 小时前
Python json模块完整教程
开发语言·python·json
易醒是好梦5 小时前
Python flask demo
开发语言·python·flask
怪侠_岭南一只猿5 小时前
爬虫工程师入门阶段一:基础知识点完全学习文档
css·爬虫·python·学习·html