xxl-job 增加python3

xxl-job 项目中,可以定时执行python脚本,但默认都是使用linux系统自带的python2.7执行脚本,与常用且常写的python3不符。本文主要解决这个问题。

解决方案

修改直接修改 com.xxl.job.core.glue.GlueTypeEnum 这个枚举即可。比如我在这个枚举新增了一个python3,既不影响之前的python2.x脚本,也可以执行python3脚本。

仅此而已,其他地方无需修改

xxl-新增python3

需要注意,修改core后,admin & executor 两个项目都需要重新获取下依赖,将这个修改同步到两个项目中。否则启动不会报错,但执行时候会报错。

e.g. 我的admin项目没有更新这个包,所以运行模式没有新增的py3选项。我的executor没有更新这个包,导致调度器执行失败,错误信息如下:

>>>>>>>>>>>触发调度<<<<<<<<<<< 
触发调度:
address:http://172.16.3.15:38078/
code:500
msg:glueType[GLUE_PYTHON3] is not valid.

修改过程

之前没有修改过源码,认为修改会很麻烦,尤其这次涉及到页面。所以先尝试了其他方法:

  1. 我首先尝试的是修改linux配置,考虑了卸载python2,毕竟官方已经不支持了。我的系统是Ubuntu 16.04.6 LTS,有14个包依赖于py2,其中有部分系统包。所以选择了放弃。

  2. 后来我想,我如果用一个非root用户,我就可以设置别名,将 python 指向 /usr/bin/python3,然后使用该用户启动执行器,那样执行器应该用的当前用户的环境变量,可以把python命令指向python3。但是这个方法并未起作用。 我觉得很奇怪,没搞懂为什么不行。懂的小伙伴麻烦分享下想法。

    # 修改用户目录下的 .bashrc 文件,新增以下配置
    alias python='/usr/bin/python3'
    
  3. 最后尝试看下源码,发现只修改这个枚举就可以。因为作者使用的是freemarker生成网页,在获取列表的时候,直接循环遍历了这个枚举类,不需要修改任何其他地方,直接就可以新增选项!为许雪里大大点赞

个人理解

  1. 因为脚本内容属于任务相关信息,所以作者大大直接放到了xxl_job_info表中。

  2. 调度器将任务信息传输给执行器的时候,若任务不是bean且在枚举中可以匹配到(根据名称匹配),则认定为脚本,构建ScriptJobHandler实例。当执行方法被调度的时候,会新建脚本文件:日志目录/gluesource/jobId_时间long值.后缀,其中后缀是根据GlueTypeEnumsuffix字段配置。在输出文件且准备参数(分片信息&参数信息)后,执行 命令 文件名称,实现脚本调度。其中命令是获取GlueTypeEnum对象的cmd 属性。

  3. XxlJobLogger打印的日志能反映到页面显示,可以考虑直接使用其记录日志:

    XxlJobLogger.log("显示的信息");
    
  4. 这个项目设计很精巧,实在佩服。

原文地址:https://www.cnblogs.com/wgh0807/p/13391185.html