xxl-job 项目中,可以定时执行python脚本,但默认都是使用linux系统自带的python2.7执行脚本,与常用且常写的python3不符。本文主要解决这个问题。
解决方案
修改直接修改 com.xxl.job.core.glue.GlueTypeEnum
这个枚举即可。比如我在这个枚举新增了一个python3,既不影响之前的python2.x脚本,也可以执行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.
修改过程
之前没有修改过源码,认为修改会很麻烦,尤其这次涉及到页面。所以先尝试了其他方法:
-
我首先尝试的是修改linux配置,考虑了卸载python2,毕竟官方已经不支持了。我的系统是Ubuntu 16.04.6 LTS,有14个包依赖于py2,其中有部分系统包。所以选择了放弃。
-
后来我想,我如果用一个非root用户,我就可以设置别名,将 python 指向
/usr/bin/python3
,然后使用该用户启动执行器,那样执行器应该用的当前用户的环境变量,可以把python命令指向python3。但是这个方法并未起作用。 我觉得很奇怪,没搞懂为什么不行。懂的小伙伴麻烦分享下想法。# 修改用户目录下的 .bashrc 文件,新增以下配置 alias python='/usr/bin/python3'
-
最后尝试看下源码,发现只修改这个枚举就可以。因为作者使用的是freemarker生成网页,在获取列表的时候,直接循环遍历了这个枚举类,不需要修改任何其他地方,直接就可以新增选项!为许雪里大大点赞
个人理解
-
因为脚本内容属于任务相关信息,所以作者大大直接放到了xxl_job_info表中。
-
调度器将任务信息传输给执行器的时候,若任务不是bean且在枚举中可以匹配到(根据名称匹配),则认定为脚本,构建
ScriptJobHandler
实例。当执行方法被调度的时候,会新建脚本文件:日志目录/gluesource/jobId_时间long值.后缀
,其中后缀是根据GlueTypeEnum
中suffix
字段配置。在输出文件且准备参数(分片信息&参数信息)后,执行命令 文件名称
,实现脚本调度。其中命令是获取GlueTypeEnum
对象的cmd
属性。 -
XxlJobLogger打印的日志能反映到页面显示,可以考虑直接使用其记录日志:
XxlJobLogger.log("显示的信息");
-
这个项目设计很精巧,实在佩服。