日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

docker部署xxl-job 通用反射执行器

發布時間:2025/7/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 docker部署xxl-job 通用反射执行器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原因

最近在公司寫一些job,公司使用的是spring boot提供的注解形式實現的。
這樣在自測的時候很麻煩,而且測試提測的時候需要修改cron表達式->提交git->jenkins打包重啟

解決方案

查閱資料后決定選用任務調度平臺,有很多優秀的任務調度平臺,選擇xxl-job是因為文檔清晰、使用簡單、基于遠程RPC調用、官方提供spring boot例子。

部署

首先需要執行官網提供的sql
使用docker下載鏡像 這里最新版本是2.0.2

docker pull xuxueli/xxl-job-admin:2.0.2

然后運行docker鏡像 注意修改參數

docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://數據庫地址:3306/xxl-job?Unicode=true&characterEncoding=UTF-8 --spring.datasource.password=數據庫密碼 --spring.mail.host=smtp.163.com --spring.mail.username=郵箱名 --spring.mail.password=郵箱密碼 --xxl.job.login.password=登錄密碼" -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin --privileged=true -d xuxueli/xxl-job-admin:2.0.2

注意一些參數如郵箱可以省略

在項目中配置

這里配置使用官網示例中的spring boot配置

@Configuration public class XxlJobConfig {private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);@Value("${xxl.job.admin.addresses}")private String adminAddresses;@Value("${xxl.job.executor.appname}")private String appName;@Value("${xxl.job.executor.ip}")private String ip;@Value("${xxl.job.executor.port}")private int port;@Value("${xxl.job.accessToken}")private String accessToken;@Value("${xxl.job.executor.logpath}")private String logPath;@Value("${xxl.job.executor.logretentiondays}")private int logRetentionDays;@Bean(initMethod = "start", destroyMethod = "destroy")public XxlJobSpringExecutor xxlJobExecutor() {logger.info(">>>>>>>>>>> xxl-job config init.");XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppName(appName);xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);return xxlJobSpringExecutor;} }

官網給出的執行器配置說明

### 調度中心部署跟地址 [選填]:如調度中心集群部署存在多個地址則用逗號分隔。執行器將會使用該地址進行"執行器心跳注冊"和"任務結果回調";為空則關閉自動注冊; xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin### 執行器AppName [選填]:執行器心跳注冊分組依據;為空則關閉自動注冊 xxl.job.executor.appname=xxl-job-executor-sample### 執行器IP [選填]:默認為空表示自動獲取IP,多網卡時可手動設置指定IP,該IP不會綁定Host僅作為通訊實用;地址信息用于 "執行器注冊" 和 "調度中心請求并觸發任務"; xxl.job.executor.ip=### 執行器端口號 [選填]:小于等于0則自動獲取;默認端口為9999,單機部署多個執行器時,注意要配置不同執行器端口; xxl.job.executor.port=9999### 執行器通訊TOKEN [選填]:非空時啟用; xxl.job.accessToken=### 執行器運行日志文件存儲磁盤路徑 [選填] :需要對該路徑擁有讀寫權限;為空則使用默認路徑; xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler### 執行器日志保存天數 [選填] :值大于3時生效,啟用執行器Log文件定期清理功能,否則不生效; xxl.job.executor.logretentiondays=-1

執行器

官方給出了不少執行器,但是要在原有項目上改造需要自己寫執行器,當然可以使用一個任務寫一個執行器,這樣執行器就會很多,很難以維護。所以這里采用反射的方式
首先是全類名執行器使用反射的方式

@Component @JobHandler(value = "BeanByClassHandler") public class BeanByClassHandler extends IJobHandler {@Autowiredprivate ApplicationContext applicationContext;//根據完整類名 通過反射執行指定方法@Overridepublic ReturnT<String> execute(String param) throws Exception {XxlJobLogger.log(param);if (param == null || param.equals("")) {return new ReturnT<>(ReturnT.FAIL_CODE, "參數不能為空!");}String[] split = param.split(",");if (split == null || split.length < 2) {return new ReturnT<>(ReturnT.FAIL_CODE, "參數格式錯誤,應為 完整類名,方法名");}Class taskBeanClass = null;try {taskBeanClass = Class.forName(split[0]);} catch (Exception e) {return new ReturnT<>(ReturnT.FAIL_CODE, "類" + split[0] + "不存在");}Method method = null;try {method = taskBeanClass.getMethod(split[1]);} catch (Exception e) {return new ReturnT<>(ReturnT.FAIL_CODE, "方法" + split[1] + "不存在");}Object o = applicationContext.getBean(taskBeanClass);if (o == null) {return new ReturnT<>(ReturnT.FAIL_CODE, "在Application中類不存在");}try {method.invoke(o);} catch (Exception e) {return new ReturnT<>(ReturnT.FAIL_CODE, "方法執行失敗");}return new ReturnT<>(ReturnT.SUCCESS_CODE, "執行成功");} }

這樣全類名很長所以可以使用spring管理beanName獲得實例進行反射

@Component @JobHandler(value = "BeanByNameHandler") public class BeanByNameHandler extends IJobHandler {@Autowiredprivate ApplicationContext applicationContext;//根據spring管理的bean name獲取指定類@Overridepublic ReturnT<String> execute(String param) throws Exception {XxlJobLogger.log(param);if (param == null || param.equals("")) {return new ReturnT<>(ReturnT.FAIL_CODE, "參數不能為空!");}String[] split = param.split(",");if (split == null || split.length < 2) {return new ReturnT<>(ReturnT.FAIL_CODE, "參數格式錯誤,應為bean名稱,方法名");}Object o = applicationContext.getBean(split[0]);if(o == null){return new ReturnT<>(ReturnT.FAIL_CODE,"類在applicationContext中不存在");}Method method;try {method = o.getClass().getMethod(split[1]);}catch (Exception e){return new ReturnT<>(ReturnT.FAIL_CODE,"方法"+split[1]+"不存在");}try {method.invoke(o);}catch (Exception e){return new ReturnT<>(ReturnT.FAIL_CODE,"調用方法失敗");}return new ReturnT<>(ReturnT.SUCCESS_CODE,"調用job成功");} }

調用

在web界面新建任務 參數為 全類名,方法名即可。如下圖所示

當然也可以執行shell腳本

缺點

  • xxl-job只支持mysql數據庫,公司使用的Oracle 所以docker需要運行一個mysql數據庫
  • xxl-job截至2.0.2版本沒有提供多用戶及權限管理
  • 轉載于:https://www.cnblogs.com/ingxx/p/11274508.html

    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的docker部署xxl-job 通用反射执行器的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。