| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- """XXL-JOB Admin → Executor 通信端点 —— 对标 Java XxlJobController.java
- 提供给 XXL-JOB Admin 调用的 HTTP API:
- POST /beat — 心跳检测
- POST /idleBeat — 空闲检测
- POST /run — 触发任务执行
- POST /kill — 强制终止任务
- POST /log — 读取执行日志
- """
- import logging
- from quart import Blueprint, request, jsonify
- logger = logging.getLogger(__name__)
- # 全局引用,由 create_xxl_bp 注入
- _executor_ref = None
- def set_xxl_executor(executor):
- """注入 XxlJobExecutor 实例(在 app 启动时调用)"""
- global _executor_ref
- _executor_ref = executor
- def create_xxl_bp() -> Blueprint:
- """创建 XXL-JOB API Blueprint
- XXL-JOB Admin 通过此 Blueprint 与执行器通信。
- 端点路径与 XXL-JOB 标准一致:/beat, /idleBeat, /run, /kill, /log
- """
- bp = Blueprint("xxl_job", __name__)
- @bp.route("/beat", methods=["POST"])
- async def beat():
- """心跳检测"""
- result = _executor_ref.beat()
- return jsonify(result)
- @bp.route("/idleBeat", methods=["POST"])
- async def idle_beat():
- """空闲检测:检查指定 jobId 是否正在运行"""
- form = await request.form
- job_id = int(form.get("jobId", 0))
- result = _executor_ref.idle_beat(job_id)
- return jsonify(result)
- @bp.route("/run", methods=["POST"])
- async def run():
- """触发任务执行"""
- form = await request.form
- trigger_params = {
- "jobId": int(form.get("jobId", 0)),
- "executorHandler": form.get("executorHandler", ""),
- "executorParams": form.get("executorParams", ""),
- "executorBlockStrategy": form.get("executorBlockStrategy", ""),
- "executorTimeout": int(form.get("executorTimeout", 0)),
- "logId": int(form.get("logId", 0)),
- "logDateTime": int(form.get("logDateTime", 0)),
- "glueType": form.get("glueType", ""),
- "glueSource": form.get("glueSource", ""),
- "glueUpdatetime": int(form.get("glueUpdatetime", 0)),
- "broadcastIndex": int(form.get("broadcastIndex", 0)),
- "broadcastTotal": int(form.get("broadcastTotal", 1)),
- }
- logger.info(
- "XXL-JOB run: handler=%s, jobId=%s, params=%s",
- trigger_params["executorHandler"],
- trigger_params["jobId"],
- trigger_params["executorParams"],
- )
- result = await _executor_ref.run(trigger_params)
- return jsonify(result)
- @bp.route("/kill", methods=["POST"])
- async def kill():
- """强制终止任务"""
- form = await request.form
- job_id = int(form.get("jobId", 0))
- logger.info("XXL-JOB kill: jobId=%s", job_id)
- result = await _executor_ref.kill(job_id)
- return jsonify(result)
- @bp.route("/log", methods=["POST"])
- async def log():
- """读取执行日志"""
- form = await request.form
- log_date_time = int(form.get("logDateTim", 0))
- log_id = int(form.get("logId", 0))
- from_line_num = int(form.get("fromLineNum", 1))
- result = _executor_ref.log(log_date_time, log_id, from_line_num)
- return jsonify(result)
- return bp
|