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("顯示的信息");
-
這個項目設計很精巧,實在佩服。