主頁 > 軟體設計 > 分布式任務調度框架xxljob2.2.0詳細安裝使用教程

分布式任務調度框架xxljob2.2.0詳細安裝使用教程

2020-12-31 11:25:53 軟體設計

分布式任務調度框架xxljob2.2.0詳細安裝使用教程

  • 簡介
    • 概述
    • 特性
  • 總體設計
    • 原始碼目錄介紹
    • “調度資料庫”配置
    • 架構設計
      • 設計思想
      • 系統組成
      • 架構圖
  • 安裝
    • 環境
    • 創建目錄
    • 下載
    • 解壓
    • 初始化調度資料庫
      • 調度資料庫表說明
    • 配置部署"調度中心"(xxl-job-admin)
      • 修改application.properties組態檔
      • 修改logback.xml(指定xxl-job的日志路徑)
    • 配置部署"執行器專案"
      • 修改執行器組態檔
      • 修改logback.xml(指定xxl-job的日志路徑)
    • 打包部署專案
    • 啟動
      • 啟動調度中心
      • 啟動執行器
    • 加入systemctl管理并設定開機自啟動
      • 創建啟動調度中心的啟動腳本
      • 將調度中心加入systemctl管理
        • 創建xxl-job-admin.service服務檔案
        • 重新加載服務串列
        • 啟動服務
      • 將調度中心設定為開機自啟動
      • 創建啟動執行器的啟動腳本
      • 將執行器加入systemctl管理
        • 創建xxl-job-executor.service服務檔案
        • 重新加載服務串列
        • 啟動服務
      • 將執行器設定為開機自啟動
  • 開發第一個任務“Hello World”
    • Gule模式
    • BEAN模式
      • BEAN模式(類形式)
        • 第一步:執行器專案中,開發Job類
        • 第二步:調度中心,新建調度任務
      • BEAN模式(方法形式)
        • 第一步:執行器專案中,開發Job方法
        • 第二步:調度中心,新建調度任務
  • 配置屬性詳細說明

簡介

概述

XXL-JOB是一個分布式任務調度平臺,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展,現已開放源代碼并接入多家公司線上產品線,開箱即用,

特性

  1. 簡單:支持通過Web頁面對任務進行CRUD操作,操作簡單,一分鐘上手,
  2. 動態:支持動態修改任務狀態、啟動/停止任務,以及終止運行中任務,即時生效,
  3. 調度中心HA(中心式):調度采用中心式設計,“調度中心”自研調度組件并支持集群部署,可保證調度中心HA,
  4. 執行器HA(分布式):任務分布式執行,任務”執行器”支持集群部署,可保證任務執行HA,
  5. 注冊中心: 執行器會周期性自動注冊任務, 調度中心將會自動發現注冊的任務并觸發執行,同時,也支持手動錄入執行器地址,
  6. 彈性擴容縮容:一旦有新執行器機器上線或者下線,下次調度時將會重新分配任務,
  7. 觸發策略:提供豐富的任務觸發策略,包括:Cron觸發、固定間隔觸發、固定延時觸發、API(事件)觸發、人工觸發、父子任務觸發,
  8. 調度過期策略:調度中心錯過調度時間的補償處理策略,包括:忽略、立即補償觸發一次等,
  9. 阻塞處理策略:調度過于密集,執行器來不及處理時的處理策略,策略包括:單機串行(默認)、丟棄后續調度、覆寫之前調度,
  10. 任務超時控制:支持自定義任務超時時間,任務運行超時將會主動中斷任務,
  11. 任務失敗重試:支持自定義任務失敗重試次數,當任務失敗時將會按照預設的失敗重試次數主動進行重試;其中分片任務支持分片粒度的失敗重試 ,
  12. 任務失敗告警;默認提供郵件方式失敗告警,同時預留擴展介面,可方便的擴展短信、釘釘等告警方式
  13. 路由策略:執行器集群部署時提供豐富的路由策略,包括:第一個、最后一個、輪詢、隨機、一致性HASH、最不經常使用、最近最久未使用、故障轉移、忙碌轉移等,
  14. 分片廣播任務:執行器集群部署時,任務路由策略選擇”分片廣播”情況下,一次任務調度將會廣播觸發集群中所有執行器執行一次任務,可根據分片引數開發分片任務,
  15. 動態分片:分片廣播任務以執行器為維度進行分片,支持動態擴容執行器集群從而動態增加分片數量,協同進行業務處理;在進行大資料量業務操作時可顯著提升任務處理能力和速度,
  16. 故障轉移:任務路由策略選擇”故障轉移”情況下,如果執行器集群中某一臺機器故障,將會自動Failover切換到一臺正常的執行器發送調度請求,
  17. 任務進度監控:支持實時監控任務進度,
  18. Rolling實時日志:支持在線查看調度結果,并且支持以Rolling方式實時查看執行器輸出的完整的執行日志,
  19. GLUE:提供Web IDE,支持在線開發任務邏輯代碼,動態發布,實時編譯生效,省略部署上線的程序,支持30個版本的歷史版本回溯,
  20. 腳本任務:支持以GLUE模式開發和運行腳本任務,包括Shell、Python、NodeJS、PHP、PowerShell等型別腳本,
  21. 命令列任務:原生提供通用命令列任務Handler(Bean任務,”CommandJobHandler”);業務方只需要提供命令列即可,
  22. 任務依賴:支持配置子任務依賴,當父任務執行結束且執行成功后將會主動觸發一次子任務的執行, 多個子任務用逗號分隔,
  23. 一致性:“調度中心”通過DB鎖保證集群分布式調度的一致性, 一次任務調度只會觸發一次執行,
  24. 自定義任務引數:支持在線配置調度任務入參,即時生效,
  25. 調度執行緒池:調度系統多執行緒觸發調度運行,確保調度精確執行,不被堵塞,
  26. 資料加密:調度中心和執行器之間的通訊進行資料加密,提升調度資訊安全性,
  27. 郵件報警:任務失敗時支持郵件報警,支持配置多郵件地址群發報警郵件
  28. 推送maven中央倉庫: 將會把最新穩定版推送到maven中央倉庫, 方便用戶接入和使用,
  29. 運行報表:支持實時查看運行資料,如任務數量、調度次數、執行器數量等;以及調度報表,如調度日期分布圖,調度成功分布圖等,
  30. 全異步:任務調度流程全異步化設計實作,如異步調度、異步運行、異步回呼等,有效對密集調度進行流量削峰,理論上支持任意時長任務的運行,
  31. 跨語言:調度中心與執行器提供語言無關的 RESTful API 服務,第三方任意語言可據此對接調度中心或者實作執行器,除此之外,還提供了 “多任務模式”和“httpJobHandler”等其他跨語言方案,
  32. 國際化:調度中心支持國際化設定,提供中文、英文兩種可選語言,默認為中文,
  33. 容器化:提供官方docker鏡像,并實時更新推送dockerhub,進一步實作產品開箱即用,
  34. 執行緒池隔離:調度執行緒池進行隔離拆分,慢任務自動降級進入”Slow”執行緒池,避免耗盡調度執行緒,提高系統穩定性,
  35. 用戶管理:支持在線管理系統用戶,存在管理員、普通用戶兩種角色,
  36. 權限控制:執行器維度進行權限控制,管理員擁有全量權限,普通用戶需要分配執行器權限后才允許相關操作,

總體設計

原始碼目錄介紹

在這里插入圖片描述

/data/xxljob/xxl-job-2.2.0/
├── doc
│   ├── db
│   ├── images
│   ├── XXL-JOB官方檔案.md
│   ├── XXL-JOB架構圖.pptx
│   └── XXL-JOB-English-Documentation.md
├── LICENSE
├── NOTICE
├── pom.xml
├── README.md
├── xxl-job-admin //調度中心,專案原始碼
│   ├── Dockerfile
│   ├── pom.xml
│   └── src
├── xxl-job-core  //公共Jar依賴
│   ├── pom.xml
│   └── src
└── xxl-job-executor-samples //執行器,Sample示例專案,我們可以在該專案上進行開發,也可以將現有專案改造生成執行器專案
    ├── pom.xml
    ├── xxl-job-executor-sample-frameless //無框架版本
    ├── xxl-job-executor-sample-jboot //Jboot版本,通過Jboot管理執行器
    ├── xxl-job-executor-sample-jfinal //JFinal版本,通過JFinal管理執行器
    ├── xxl-job-executor-sample-nutz //Nutz版本,通過Nutz管理執行器
    ├── xxl-job-executor-sample-spring //Spring版本,通過Spring容器管理執行器,比較通用
    └── xxl-job-executor-sample-springboot //Springboot版本,通過Springboot管理執行器,推薦這種方式

“調度資料庫”配置

XXL-JOB調度模塊基于自研調度組件并支持集群部署,調度資料庫表說明如下:

  • xxl_job_lock:任務調度鎖表;
  • xxl_job_group:執行器資訊表,維護任務執行器資訊;
  • xxl_job_info:調度擴展資訊表: 用于保存XXL-JOB調度任務的擴展資訊,如任務分組、任務名、機器地址、執行器、執行入參和報警郵件等等;
  • xxl_job_log:調度日志表: 用于保存XXL-JOB任務調度的歷史資訊,如調度結果、執行結果、調度入參、調度機器和執行器等等;
  • xxl_job_log_report:調度日志報表:用戶存盤XXL-JOB任務調度日志的報表,調度中心報表功能頁面會用到;
  • xxl_job_logglue:任務GLUE日志:用于保存GLUE更新歷史,用于支持GLUE的版本回溯功能;
  • xxl_job_registry:執行器注冊表,維護在線的執行器和調度中心機器地址資訊;
  • xxl_job_user:系統用戶表;

架構設計

設計思想

將調度行為抽象形成“調度中心”公共平臺,而平臺自身并不承擔業務邏輯,“調度中心”負責發起調度請求,
將任務抽象成分散的JobHandler,交由“執行器”統一管理,“執行器”負責接收調度請求并執行對應的JobHandler中業務邏輯,
因此,“調度”和“任務”兩部分可以相互解耦,提高系統整體穩定性和擴展性,

系統組成

  • 調度模塊(調度中心)
    負責管理調度資訊,按照調度配置發出調度請求,自身不承擔業務代碼,調度系統與任務解耦,提高了系統可用性和穩定性,同時調度系統性能不再受限于任務模塊;
    支持可視化、簡單且動態的管理調度資訊,包括任務新建,更新,洗掉,GLUE開發和任務報警等,所有上述操作都會實時生效,同時支持監控調度結果以及執行日志,支持執行器Failover,
  • 執行模塊(執行器)
    負責接收調度請求并執行任務邏輯,任務模塊專注于任務的執行等操作,開發和維護更加簡單和高效;
    接收“調度中心”的執行請求、終止請求和日志請求等,

架構圖

在這里插入圖片描述

安裝

環境

官網要求預安裝環境

Maven3+
Jdk1.8+
Mysql5.7+

本機環境
在這里插入圖片描述
在這里插入圖片描述
我這里是安裝好了jdk和maven的,如果有需要的可以參考centos8使用war包安裝部署jenkins以及初始化配置這篇文章,這個里面有詳細的安裝以及配置步驟,
在這里插入圖片描述
MySQL我安裝的是8.0.21版本的,如果有需要,可以參考centos8安裝MySQL8,里面有詳細的安裝已經配置步驟,

創建目錄

[root@dxm31 ~]# mkdir -p /data/xxljob
[root@dxm31 ~]# cd /data/xxljob/

下載

[root@dxm31 xxljob]# wget https://github.com/xuxueli/xxl-job/archive/v2.2.0.tar.gz
[root@dxm31 xxljob]# ll -h

在這里插入圖片描述

解壓

[root@dxm31 xxljob]# tar -zxvf v2.2.0.tar.gz

在這里插入圖片描述

初始化調度資料庫

“調度資料庫初始化SQL腳本” 位置為:/xxl-job/doc/db/tables_xxl_job.sql
調度中心支持集群部署,集群情況下各節點務必連接同一個mysql實體;
如果mysql做主從,調度中心集群節點務必強制走主庫;

調度資料庫表說明

xxl_job_info:調度擴展資訊表: 用于保存XXL-JOB調度任務的擴展資訊,如任務分組、任務名、機器地址、執行器、執行入參和報警郵件等等;
xxl_job_log:調度日志表: 用于保存XXL-JOB任務調度的歷史資訊,如調度結果、執行結果、調度入參、調度機器和執行器等等;
xxl_job_log_report:調度日志報表:用戶存盤XXL-JOB任務調度日志的報表,調度中心報表功能頁面會用到;
xxl_job_logglue:任務GLUE日志:用于保存GLUE更新歷史,用于支持GLUE的版本回溯功能;
xxl_job_registry:執行器注冊表,維護在線的執行器和調度中心機器地址資訊;
xxl_job_group:執行器資訊表,維護任務執行器資訊;
xxl_job_user:系統用戶表;
xxl_job_lock:任務調度鎖表;

我們可以通過mysql -uroot -p123456 < /data/xxljob/xxl-job-2.2.0/doc/db/tables_xxl_job.sql這種操作來初始化資料庫,也可以通過用navicat工具匯入再執行sql這種操作來初始化資料庫,大家任意選擇,怎么方便怎么來,
在這里插入圖片描述

配置部署"調度中心"(xxl-job-admin)

調度中心作用:統一管理任務調度平臺上調度任務,負責觸發調度執行,并且提供任務管理平臺,

修改application.properties組態檔

調度中心組態檔地址:/xxl-job/xxl-job-admin/src/main/resources/application.properties

修改此組態檔

[root@dxm31 ~]# vim /data/xxljob/xxl-job-2.2.0/xxl-job-admin/src/main/resources/application.properties

內容如下:

### web
server.port=8082
server.context-path=/xxl-job-admin

### actuator
management.server.servlet.context-path=/actuator
management.health.mail.enabled=false

### resources
spring.mvc.servlet.load-on-startup=0
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/

### freemarker
spring.freemarker.templateLoaderPath=classpath:/templates/
spring.freemarker.suffix=.ftl
spring.freemarker.charset=UTF-8
spring.freemarker.request-context-attribute=request
spring.freemarker.settings.number_format=0.##########

### mybatis
mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
#mybatis.type-aliases-package=com.xxl.job.admin.core.model

### xxl-job, datasource 調度中心JDBC鏈接:鏈接地址請保持和 2.1章節 所創建的調度資料庫的地址一致
spring.datasource.url=jdbc:mysql://192.168.0.22:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

### datasource-pool
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=HikariCP
spring.datasource.hikari.max-lifetime=900000
spring.datasource.hikari.connection-timeout=10000
spring.datasource.hikari.connection-test-query=SELECT 1

### xxl-job email 報警郵箱
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxx@qq.com
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory

### xxl-job, access token 調度中心通訊TOKEN [選填]:非空時啟用;
xxl.job.accessToken=

### xxl-job, i18n (default is zh_CN, and you can choose "zh_CN", "zh_TC" and "en") 調度中心國際化配置 [必填]: 默認為 "zh_CN"/中文簡體, 可選范圍為 "zh_CN"/中文簡體, "zh_TC"/中文繁體 and "en"/英文;
xxl.job.i18n=zh_CN

## xxl-job, triggerpool max size 調度執行緒池最大執行緒配置【必填】
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100

### xxl-job, log retention days 調度中心日志表資料保存天數 [必填]:過期日志自動清理;限制大于等于7時生效,否則, 如-1,關閉自動清理功能;
xxl.job.logretentiondays=30

其中web 埠默認是8080,如果有沖突,一定要更換(本文采用8082,因為8080是tomcat服務,8081是maven私服,),另外spring.datasource.url注意一下這里的IP,如果不是127.0.0.1,也一定要更換,

修改logback.xml(指定xxl-job的日志路徑)

查看一下默認配置日志路徑:
在這里插入圖片描述
默認日志路徑為:/data/applogs/xxl-job/xxl-job-admin.log,我們改為/data/xxl-job/xxl-job-admin.log,
操作步驟:

[root@dxm31 ~]# vim /data/xxljob/xxl-job-2.2.0/xxl-job-admin/src/main/resources/logback.xml

修改以下內容:

<property name="log.path" value="/data/xxl-job/xxl-job-admin.log"/>

在這里插入圖片描述

配置部署"執行器專案"

“執行器”專案:xxl-job-executor-sample-springboot (提供多種版本執行器供選擇,現以 springboot 版本為例,可直接使用,也可以參考其并將現有專案改造成執行器),

作用:負責接收“調度中心”的調度并執行;可直接部署執行器,也可以將執行器集成到現有業務專案中,

修改執行器組態檔

我們以 springboot 版本為例,要修改的組態檔路徑為:xxl-job-2.2.0/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties

[root@dxm31 ~]# vim /data/xxljob/xxl-job-2.2.0/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties

修改內容如下:

# web port
server.port=8083
# no web
#spring.main.web-environment=false

# log config
logging.config=classpath:logback.xml


### xxl-job admin address list, such as "http://address" or "http://address01,http://address02" 調度中心部署跟地址 [選填]:如調度中心集群部署存在多個地址則用逗號分隔,執行器將會使用該地址進行"執行器心跳注冊"和"任務結果回呼";為空則關閉自動注冊;
xxl.job.admin.addresses=http://127.0.0.1:8082/xxl-job-admin

### xxl-job, access token 執行器通訊TOKEN [選填]:非空時啟用;
xxl.job.accessToken=

### xxl-job executor appname 執行器AppName [選填]:執行器心跳注冊分組依據;為空則關閉自動注冊
xxl.job.executor.appname=xxl-job-executor-sample
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null 執行器注冊 [選填]:優先使用該配置作為注冊地址,為空時使用內嵌服務 ”IP:PORT“ 作為注冊地址,從而更靈活的支持容器型別執行器動態IP和動態映射埠問題,
xxl.job.executor.address=
### xxl-job executor server-info 執行器IP [選填]:默認為空表示自動獲取IP,多網卡時可手動設定指定IP,該IP不會系結Host僅作為通訊實用;地址資訊用于 "執行器注冊" 和 "調度中心請求并觸發任務";
xxl.job.executor.ip=
### 執行器埠號 [選填]:小于等于0則自動獲取;默認埠為9999,單機部署多個執行器時,注意要配置不同執行器埠;
xxl.job.executor.port=9999
### xxl-job executor log-path 執行器運行日志檔案存盤磁盤路徑 [選填] :需要對該路徑擁有讀寫權限;為空則使用默認路徑;
xxl.job.executor.logpath=/data/xxl-job/jobhandler
### xxl-job executor log-retention-days 執行器日志檔案保存天數 [選填] : 過期日志自動清理, 限制值大于等于3時生效; 否則, 如-1, 關閉自動清理功能;
xxl.job.executor.logretentiondays=30

其中web 埠默認是8081,如果有沖突,一定要更換(本文采用8083)

修改logback.xml(指定xxl-job的日志路徑)

查看一下默認配置日志路徑:
在這里插入圖片描述
默認日志路徑為:/data/applogs/xxl-job/xxl-job-executor-sample-springboot.log,我們改為/data/xxl-job/xxl-job-executor-sample-springboot.log,
操作步驟:

[root@dxm31 ~]# vim /data/xxljob/xxl-job-2.2.0/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/logback.xml

修改以下內容:

<property name="log.path" value="/data/xxl-job/xxl-job-executor-sample-springboot.log"/>

在這里插入圖片描述

打包部署專案

如果已經正確進行上述配置,可將專案編譯打包部署,

[root@dxm31 ~]# cd /data/xxljob/xxl-job-2.2.0/
[root@dxm31 xxl-job-2.2.0]# mvn clean install

在這里插入圖片描述
看到這個證明專案編譯打包完成,
查看一下xxl-job-admin/target/下面是否有xxl-job-admin-2.2.0.jar:

[root@dxm31 xxl-job-2.2.0]# ll xxl-job-admin/target/

在這里插入圖片描述
查看一下xxl-job-executor-samples/xxl-job-executor-sample-springboot/target/下面是否有xxl-job-executor-sample-springboot-2.2.0.jar:

[root@dxm31 xxl-job-2.2.0]# ll xxl-job-executor-samples/xxl-job-executor-sample-springboot/target/

在這里插入圖片描述

啟動

啟動調度中心

啟動調度中心命令:nohup java -jar xxl-job-admin/target/xxl-job-admin-2.2.0.jar &

[root@dxm31 xxl-job-2.2.0]# nohup java -jar xxl-job-admin/target/xxl-job-admin-2.2.0.jar &

在這里插入圖片描述
查看行程以及埠監聽情況:

[root@dxm31 xxl-job-2.2.0]# ps aux | grep xxl-job-admin
[root@dxm31 xxl-job-2.2.0]# netstat -ntlp | grep 8082

在這里插入圖片描述
我們用瀏覽器訪問一下http://IP+埠,我們這里是http://192.168.0.31:8082/xxl-job-admin
在這里插入圖片描述
默認登錄賬號 “admin/123456”, 登錄后運行界面如下圖所示:在這里插入圖片描述
至此“調度中心”專案已經部署成功,

啟動執行器

啟動執行器命令:nohup java -jar xxl-job-executor-samples/xxl-job-executor-sample-springboot/target/xxl-job-executor-sample-springboot-2.2.0.jar &

[root@dxm31 xxl-job-2.2.0]# nohup java -jar xxl-job-executor-samples/xxl-job-executor-sample-springboot/target/xxl-job-executor-sample-springboot-2.2.0.jar &

在這里插入圖片描述
查看行程以及埠監聽情況:

[root@dxm31 xxl-job-2.2.0]# ps aux | grep xxl-job-executor-sample-springboot
[root@dxm31 xxl-job-2.2.0]# netstat -ntlp | grep 8083

在這里插入圖片描述
至此“執行器”專案已經部署結束,

加入systemctl管理并設定開機自啟動

創建啟動調度中心的啟動腳本

#  創建/usr/local/xxl-job目錄,用于存放jar包和啟動腳本
[root@dxm31 ~]# mkdir -p /usr/local/xxl-job

# 將編譯打包后的xxl-job-admin-2.2.0.jar復制到/usr/local/xxl-job目錄下
[root@dxm31 ~]# cp /data/xxljob/xxl-job-2.2.0/xxl-job-admin/target/xxl-job-admin-2.2.0.jar /usr/local/xxl-job/

# 創建啟動腳本并撰寫內容
[root@dxm31 ~]# vim /usr/local/xxl-job/startadmin.sh

#!/bin/sh

nohup /usr/local/jdk/bin/java -jar /usr/local/xxl-job/xxl-job-admin-2.2.0.jar >> ./nohup.out 2>&1 &

# 給啟動腳本增加可執行權限
[root@dxm31 ~]# chmod +x /usr/local/xxl-job/startadmin.sh

將調度中心加入systemctl管理

創建xxl-job-admin.service服務檔案

創建xxl-job-admin.service服務檔案

[root@dxm31 ~]# vim /etc/systemd/system/xxl-job-admin.service

內容如下:

[Unit]
Description=xxl-job-admin server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
User=root
Group=root
ExecStart=sh /usr/local/xxl-job/startadmin.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target

重新加載服務串列

[root@dxm31 ~]# systemctl daemon-reload

啟動服務

# 停止上面手動后臺啟動的xxl-job-admin服務
[root@dxm31 xxl-job-2.2.0]# ps aux | grep xxl-job-admin
root        4812  0.7 15.1 4542108 582008 pts/0  Sl   12:12   0:28 java -jar xxl-job-admin/target/xxl-job-admin-2.2.0.jar
root        5778  0.0  0.0  12320  1068 pts/0    R+   13:14   0:00 grep --color=auto xxl-job-admin

[root@dxm31 xxl-job-2.2.0]# kill -9 4812

# 檢查是否還存在xxl-job-admin行程
[root@dxm31 xxl-job-2.2.0]# ps aux | grep xxl-job-admin
root        5789  0.0  0.0  12320  1084 pts/0    S+   13:15   0:00 grep --color=auto xxl-job-admin

# 查詢所有服務單元是否有xxl-job-admin
[root@dxm31 xxl-job-2.2.0]# systemctl list-unit-files | grep xxl-job-admin
xxl-job-admin.service                      disabled

# 存在,且非開啟自啟動,使用systemctl啟動xxl-job-admin服務
[root@dxm31 xxl-job-2.2.0]# systemctl start xxl-job-admin.service

# 查看nginx服務狀態
[root@dxm31 xxl-job-2.2.0]# systemctl status xxl-job-admin.service

在這里插入圖片描述
Active: active (running) 可以看到xxl-job-admin服務已經啟動成功,查看行程以及埠的監聽情況:

[root@dxm31 xxl-job-2.2.0]# ps aux | grep xxl-job-admin

[root@dxm31 xxl-job-2.2.0]# netstat -ntlp | grep 8082

在這里插入圖片描述
瀏覽器訪問http://192.168.0.31:8082/xxl-job-admin
在這里插入圖片描述

將調度中心設定為開機自啟動

[root@dxm31 xxl-job-2.2.0]# systemctl list-unit-files | grep xxl-job-admin.service
xxl-job-admin.service                      disabled
# disabled表示非開機自啟動

# 設定為開機自啟動
[root@dxm31 xxl-job-2.2.0]# systemctl enable xxl-job-admin.service
Created symlink /etc/systemd/system/multi-user.target.wants/xxl-job-admin.service → /etc/systemd/system/xxl-job-admin.service.

# 再次查看
[root@dxm31 xxl-job-2.2.0]# systemctl list-unit-files | grep xxl-job-admin.service
xxl-job-admin.service                      enabled

# enabled表示是開機自啟動,執行重啟命令
[root@dxm31 xxl-job-2.2.0]# reboot

#重啟后再次查看xxl-job-admin服務已啟動完成,

創建啟動執行器的啟動腳本


# 將編譯打包后的xxl-job-executor-sample-springboot-2.2.0.jar復制到/usr/local/xxl-job目錄下
[root@dxm31 xxl-job-2.2.0]# cp /data/xxljob/xxl-job-2.2.0/xxl-job-executor-samples/xxl-job-executor-sample-springboot/target/xxl-job-executor-sample-springboot-2.2.0.jar /usr/local/xxl-job/

# 創建啟動腳本并撰寫內容
[root@dxm31 xxl-job-2.2.0]# vim /usr/local/xxl-job/startexecutor.sh

#!/bin/sh

nohup /usr/local/jdk/bin/java -jar /usr/local/xxl-job/xxl-job-executor-sample-springboot-2.2.0.jar >> ./nohup.out 2>&1 &

# 給啟動腳本增加可執行權限
[root@dxm31 xxl-job-2.2.0]# chmod +x /usr/local/xxl-job/startexecutor.sh

將執行器加入systemctl管理

創建xxl-job-executor.service服務檔案

創建xxl-job-executor.service服務檔案

[root@dxm31 xxl-job-2.2.0]# vim /etc/systemd/system/xxl-job-executor.service

內容如下:

[Unit]
Description=xxl-job-executor server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
User=root
Group=root
ExecStart=sh /usr/local/xxl-job/startexecutor.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target

重新加載服務串列

[root@dxm31 xxl-job-2.2.0]# systemctl daemon-reload

啟動服務

# 停止上面手動后臺啟動的執行器服務
[root@dxm31 xxl-job-2.2.0]# ps aux | grep xxl-job-executor-sample-springboot
root        6953  291  9.0 4518132 349104 pts/0  Sl   14:20   0:08 java -jar xxl-job-executor-samples/xxl-job-executor-sample-springboot/target/xxl-job-executor-sample-springboot-2.2.0.jar
root        6999  0.0  0.0  12320  1088 pts/0    S+   14:20   0:00 grep --color=auto xxl-job-executor-sample-springboot

[root@dxm31 xxl-job-2.2.0]# kill -9 6953

# 檢查是否還存在執行器行程
[root@dxm31 xxl-job-2.2.0]# ps aux | grep xxl-job-executor-sample-springboot
root        7016  0.0  0.0  12320  1068 pts/0    S+   14:22   0:00 grep --color=auto xxl-job-executor-sample-springboot

# 查詢所有服務單元是否有執行器
[root@dxm31 xxl-job-2.2.0]# systemctl list-unit-files | grep xxl-job-executor.service
xxl-job-executor.service                   disabled

# 存在,且非開啟自啟動,使用systemctl啟動執行器服務
[root@dxm31 xxl-job-2.2.0]# systemctl start xxl-job-executor.service

# 查看nginx服務狀態
[root@dxm31 xxl-job-2.2.0]# systemctl status xxl-job-executor.service

在這里插入圖片描述
Active: active (running) 可以看到執行器服務已經啟動成功,查看行程以及埠的監聽情況:

[root@dxm31 xxl-job-2.2.0]# ps aux | grep xxl-job-executor-sample-springboot
[root@dxm31 xxl-job-2.2.0]# netstat -ntlp | grep 8083

在這里插入圖片描述

將執行器設定為開機自啟動

[root@dxm31 xxl-job-2.2.0]# systemctl list-unit-files | grep xxl-job-executor.service
xxl-job-executor.service                   disabled
# disabled表示非開機自啟動

# 設定為開機自啟動
[root@dxm31 xxl-job-2.2.0]# systemctl enable xxl-job-executor.service
Created symlink /etc/systemd/system/multi-user.target.wants/xxl-job-executor.service → /etc/systemd/system/xxl-job-executor.service.

# 再次查看
[root@dxm31 xxl-job-2.2.0]# systemctl list-unit-files | grep xxl-job-executor.service
xxl-job-executor.service                   enabled

# enabled表示是開機自啟動,執行重啟命令
[root@dxm31 xxl-job-2.2.0]# reboot

#重啟后再次查看執行器服務已啟動完成,

開發第一個任務“Hello World”

任務運行模式主要有Bean模式和Gule模式(理解為腳本),下面我們就分別以這兩種不同的運行模式分別開發一個任務,

Gule模式

“GLUE模式(Java)”的執行代碼托管到調度中心在線維護,相比“Bean模式任務”需要在執行器專案開發部署上線,更加簡便輕量,

前提:請確認“調度中心”和“執行器”專案已經成功部署并啟動!!!!

原理: 每個 “GLUE模式(Java)” 任務的代碼,實際上是“一個繼承自“IJobHandler”的實作類的類代碼”,“執行器”接收到“調度中心”的調度請求時,會通過Groovy類加載器加載此代碼,實體化成Java物件,同時注入此代碼中宣告的Spring服務(請確保Glue代碼中的服務和類參考在“執行器”專案中存在),然后呼叫該物件的execute方法,執行任務邏輯,

下面開始介紹一下詳細的步驟:
第一步:新建任務
登錄調度中心,點擊下圖所示“新建任務”按鈕,新建示例任務,然后,參考下面截圖中任務的引數配置,點擊保存,
在這里插入圖片描述
在這里插入圖片描述
從這個圖,大家可以發現,cron運算式的撰寫更加方便了,
點擊保存之后,彈出:
在這里插入圖片描述
點擊確定,在這里插入圖片描述
這個就是我們上面新建的任務,
在這里插入圖片描述
從任務管理串列截圖可以看出比之前增加了根據狀態、任務描述以及負責人這三個搜索項,
第二步:“GLUE模式(Java)” 任務開發
在這里插入圖片描述
我們在我們上面新建任務『測驗』這列操作選擇GLUE IDE,進入 “GLUE編輯器開發界面” ,見下圖,“GLUE模式(Java)” 運行模式的任務默認已經初始化了示例任務代碼,即列印Hello World,
在這里插入圖片描述
我們簡單改變一下這段示例代碼,在log后面加上當前時間,然后點擊保存,輸入原始碼備注,保存成功,

版本回溯功能(支持30個版本的版本回溯):在GLUE任務的Web IDE界面,選擇右上角下拉框“版本回溯”,會列出該GLUE的更新歷史,選擇相應版本即可顯示該版本代碼,保存后GLUE代碼即回退到對應的歷史版本;

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		XxlJobLogger.log("XXL-JOB, Hello World."+df.format(System.currentTimeMillis()));

注意:要匯入需要的包,否則會執行失敗,

import java.text.SimpleDateFormat;
import java.util.Date;

見下圖:
在這里插入圖片描述
GLUE模式(Java):任務以原始碼方式維護在調度中心;該模式的任務實際上是一段繼承自IJobHandler的Java類代碼并 “groovy” 原始碼方式維護,它在執行器專案中運行,可使用@Resource/@Autowire注入執行器里中的其他服務,
第三步:觸發執行
點擊任務右側操作下面的 “執行一次” 按鈕,可手動觸發一次任務執行(通常情況下,通過配置Cron運算式進行任務調度觸發),
在這里插入圖片描述
在這里插入圖片描述
我們這里是簡單的任務測驗,無需輸入任何引數,只需要點擊『保存』按鈕即可,在這里插入圖片描述
第四步:查看日志
點擊任務右側操作下 “查詢日志” 按鈕,可前往調度日志界面查看調度日志,
在調度日志界面中,可查看該任務的歷史調度記錄以及每一次調度的調度時間、調度結果、調度備注、執行時間、執行結果和執行備注,運行中的任務點擊右側的“執行日志”按鈕,可進入日志控制臺查看實時執行日志,在這里插入圖片描述
在這里插入圖片描述
可以看到調度結果和執行結果都是:成功,我們點擊調度備注查看:在這里插入圖片描述
點擊操作,里面有執行日志和終止任務兩個按鈕:
在這里插入圖片描述
由于我們任務比較簡單,已經執行完成,我們來點擊一下執行日志按鈕看一下:
在這里插入圖片描述

2020-12-28 15:39:35 [com.xxl.job.core.thread.JobThread#run]-[124]-[Thread-8] 
----------- xxl-job job execute start -----------
----------- Param:
2020-12-28 15:39:35 [com.xxl.job.core.handler.impl.GlueJobHandler#execute]-[26]-[Thread-9] ----------- glue.version:1609141157000 -----------
2020-12-28 15:39:35 [sun.reflect.NativeMethodAccessorImpl#invoke0]-[-2]-[Thread-9] XXL-JOB, Hello World.2020-12-28 15:39:35
2020-12-28 15:39:35 [com.xxl.job.core.thread.JobThread#run]-[164]-[Thread-8] 
----------- xxl-job job execute end(finish) -----------
----------- ReturnT:ReturnT [code=200, msg=null, content=null]
2020-12-28 15:39:35 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[191]-[xxl-job, executor TriggerCallbackThread] 
----------- xxl-job job callback finish.

[Load Log Finish]

我們可以看到這里面有job執行開始資訊、引數、glue版本號、我們輸入的Hello World.+當前時間、job執行結束資訊、ReturnT:ReturnT回傳執行結果以及job 回到完成資訊,

通過我們上面的簡單的開發任務可以看出GLUE的**原理是:每一個GLUE模式的代碼,在“執行器”接受到調度請求時,都會通過Groovy類加載器加載出代碼,并實體化成Java物件,同時注入此代碼中宣告的Spring服務(這里要確保代碼中所參考的類或服務在“執行器專案中存在”),接著呼叫該物件的execute方法,執行具體的任務邏輯,**說白了,就是任務以原始碼方式維護在調度中心,支持通過Web IDE在線更新,實時編譯和生效,因此不需要指定JobHandler,

BEAN模式

在該模式下,任務的具體實作邏輯是以JobHandler的形式存在于“執行器專案”中

BEAN模式(類形式)

Bean模式(類形式)任務支持基于類的開發方式,每個任務對應一個Java類,

  • 優點:不限制專案環境,兼容性好,即使是無框架專案,如main方法直接啟動的專案也可以提供支持,可以參考示例專案 “xxl-job-executor-sample-frameless”;
  • 缺點:每個任務需要占用一個Java類,造成類的浪費;
    不支持自動掃描任務并注入到執行器容器,需要手動注入,

原理: 每個Bean模式任務都是一個Spring的Bean類實體,它被維護在“執行器”專案的Spring容器中,任務類需要加“@JobHandler(value=”名稱”)”注解,因為“執行器”會根據該注解識別Spring容器中的任務,任務類需要繼承統一介面“IJobHandler”任務邏輯在execute方法中開發,因為“執行器”在接收到調度中心的調度請求時,將會呼叫“IJobHandler”的execute方法,執行任務邏輯,

第一步:執行器專案中,開發Job類

  • 開發一個繼承自"com.xxl.job.core.handler.IJobHandler"的JobHandler類,實作其中任務方法,

  • 手動通過如下方式注入到執行器容器,
    XxlJobExecutor.registJobHandler(“demoJobHandler”, new DemoJobHandler());

第二步:調度中心,新建調度任務

運行模式選中 “BEAN模式”,JobHandler屬性填寫任務注解“@JobHandler”中定義的值;
在這里插入圖片描述
點擊保存:在這里插入圖片描述
在這里插入圖片描述
接下來就可以對任務進行執行一次、查看日志、啟動等操作,

BEAN模式(方法形式)

Bean模式(方法形式)任務支持基于方法的開發方式,每個任務對應一個方法,

  • 優點:每個任務只需要開發一個方法,并添加”@XxlJob”注解即可,更加方便、快速,
    支持自動掃描任務并注入到執行器容器,
  • 缺點:要求Spring容器環境;

基于方法開發的任務,底層會生成JobHandler代理,和基于類的方式一樣,任務也會以JobHandler的形式存在于執行器任務容器中,

第一步:執行器專案中,開發Job方法

1、任務開發:在Spring Bean實體中,開發Job方法;
2、注解配置:為Job方法添加注解 "@XxlJob(value="自定義jobhandler名稱", init = "JobHandler初始化方法", destroy = "JobHandler銷毀方法")",注解value值對應的是調度中心新建任務的JobHandler屬性的值,
3、執行日志:需要通過 "XxlJobHelper.log" 列印執行日志;
4、任務結果:默認任務結果為 "成功" 狀態,不需要主動設定;如有訴求,比如設定任務結果為失敗,可以通過 "XxlJobHelper.handleFail/handleSuccess" 自主設定任務結果;

// 可參考Sample示例執行器中的 “com.xxl.job.executor.service.jobhandler.SampleXxlJob” ,如下:
@XxlJob(“demoJobHandler”)
public void demoJobHandler() throws Exception {
XxlJobHelper.log(“XXL-JOB, Hello World.”);
}

第二步:調度中心,新建調度任務

運行模式選中 “BEAN模式”,JobHandler屬性填寫任務注解“@XxlJob”中定義的值,可以參考下面“配置屬性詳細說明”對新建的任務進行引數配置,

配置屬性詳細說明

基礎配置:

  • 執行器:任務的系結的執行器,任務觸發調度時將會自動發現注冊成功的執行器, 實作任務自動發現功能; 另一方面也可以方便的進行任務分組,每個任務必須系結一個執行器, 可在 “執行器管理” 進行設定;
  • 任務描述:任務的描述資訊,便于任務管理;
  • 負責人:任務的負責人;
  • 報警郵件:任務調度失敗時郵件通知的郵箱地址,支持配置多郵箱地址,配置多個郵箱地址時用逗號分隔;

觸發配置:

  • 調度型別
    無:該型別不會主動觸發調度;
    CRON:該型別將會通過CRON,觸發任務調度;
    固定速度:該型別將會以固定速度,觸發任務調度;按照固定的間隔時間,周期性觸發;
    固定延遲:該型別將會以固定延遲,觸發任務調度;按照固定的延遲時間,從上次調度結束后開始計算延遲時間,到達延遲時間后觸發下次調度;
  • CRON:觸發任務執行的Cron運算式;
  • 固定速度:韌體速度的時間間隔,單位為秒;
  • 固定延遲:韌體延遲的時間間隔,單位為秒;

任務配置:

  • 運行模式
    BEAN模式:任務以JobHandler方式維護在執行器端;需要結合 “JobHandler” 屬性匹配執行器中任務;
    GLUE模式(Java):任務以原始碼方式維護在調度中心;該模式的任務實際上是一段繼承自IJobHandler的Java類代碼并 “groovy” 原始碼方式維護,它在執行器專案中運行,可使用@Resource/@Autowire注入執行器里中的其他服務;
    GLUE模式(Shell):任務以原始碼方式維護在調度中心;該模式的任務實際上是一段 “shell” 腳本;
    GLUE模式(Python):任務以原始碼方式維護在調度中心;該模式的任務實際上是一段 “python” 腳本;
    GLUE模式(PHP):任務以原始碼方式維護在調度中心;該模式的任務實際上是一段 “php” 腳本;
    GLUE模式(NodeJS):任務以原始碼方式維護在調度中心;該模式的任務實際上是一段 “nodejs” 腳本;
    GLUE模式(PowerShell):任務以原始碼方式維護在調度中心;該模式的任務實際上是一段 “PowerShell” 腳本;
  • JobHandler:運行模式為 “BEAN模式” 時生效,對應執行器中新開發的JobHandler類“@JobHandler”注解自定義的value值;
  • 執行引數:任務執行所需的引數;

高級配置:

  • 路由策略:當執行器集群部署時,提供豐富的路由策略,包括;
    FIRST(第一個):固定選擇第一個機器;
    LAST(最后一個):固定選擇最后一個機器;
    ROUND(輪詢):;
    RANDOM(隨機):隨機選擇在線的機器;
    CONSISTENT_HASH(一致性HASH):每個任務按照Hash演算法固定選擇某一臺機器,且所有任務均勻散列在不同機器上,
    LEAST_FREQUENTLY_USED(最不經常使用):使用頻率最低的機器優先被選舉;
    LEAST_RECENTLY_USED(最近最久未使用):最久未使用的機器優先被選舉;
    FAILOVER(故障轉移):按照順序依次進行心跳檢測,第一個心跳檢測成功的機器選定為目標執行器并發起調度;
    BUSYOVER(忙碌轉移):按照順序依次進行空閑檢測,第一個空閑檢測成功的機器選定為目標執行器并發起調度;
    SHARDING_BROADCAST(分片廣播):廣播觸發對應集群中所有機器執行一次任務,同時系統自動傳遞分片引數;可根據分片引數開發分片任務;
  • 子任務:每個任務都擁有一個唯一的任務ID(任務ID可以從任務串列獲取),當本任務執行結束并且執行成功時,將會觸發子任務ID所對應的任務的一次主動調度,
  • 調度過期策略
    • 忽略:調度過期后,忽略過期的任務,從當前時間開始重新計算下次觸發時間;
    • 立即執行一次:調度過期后,立即執行一次,并從當前時間開始重新計算下次觸發時間;
  • 阻塞處理策略:調度過于密集執行器來不及處理時的處理策略;
    單機串行(默認):調度請求進入單機執行器后,調度請求進入FIFO佇列并以串行方式運行;
    丟棄后續調度:調度請求進入單機執行器后,發現執行器存在運行的調度任務,本次請求將會被丟棄并標記為失敗;
    覆寫之前調度:調度請求進入單機執行器后,發現執行器存在運行的調度任務,將會終止運行中的調度任務并清空佇列,然后運行本地調度任務;
  • 任務超時時間:支持自定義任務超時時間,任務運行超時將會主動中斷任務;
  • 失敗重試次數;支持自定義任務失敗重試次數,當任務失敗時將會按照預設的失敗重試次數主動進行重試;

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/242863.html

標籤:其他

上一篇:Spring Cloud 2020.0.0 正式發布,對開發者來說意味著什么?

下一篇:HaaS100低功耗藍牙體驗

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more