框架概述
框架主頁:
https://www.xuxueli.com/xxl-job/
包含組件:
1.調度中心
2.任務執行器
特點:
1.調度中心,任務執行器獨立部署,互不影響。
2.調度中心和任務執行器都支持集群化部署,避免出現單點故障。
3.調用中心和執行器之間通過HTTP協議進行通信,因此需要把它們部署在能相互連通的網絡環境。
安裝部署
基於v2.3.0版本進行說明。
調度中心
調度中心是與業務無關的,直接從源碼編譯部署即可。
從這里下載最新的項目源碼壓縮包,解壓到本地。
第一步:初始化調度中心數據庫
SQL語句文件位於項目源碼目錄中,路徑:項目源碼目錄\doc\db\tables_xxl_job.sql
初始化數據庫及表的操作比較簡單,具體實現省略。
第二步:編譯調度中心運行包
(1)進入到解壓后的項目源碼目錄,打開配置文件項目源碼目錄\xxl-job-admin\src\main\resources\application.properties
。
(2)修改配置參數:在此之前需要通過【第一步】完成調度中心數據庫的創建和登錄授權的設置。
- 修改數據庫連接參數
### xxl-job, datasource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root # 數據庫用戶名
spring.datasource.password=root_pwd # 數據庫用戶密碼
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
- 修改報警郵件配置信息
### xxl-job, email
spring.mail.host=smtp.qq.com # 郵件服務器主機
spring.mail.port=25 # 郵件服務器端口
spring.mail.username=xxx@qq.com # 郵件賬戶
spring.mail.from=xxx@qq.com # 發送郵件賬號,通常跟spring.mail.username值一致
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
(3)編譯調度中心運行包
進入到項目源碼目錄,執行:mvn clean package
,將會在“項目源碼目錄\xxl-job-admin\target”路徑下生成調度中心運行jar包:xxl-job-admin-${version}.jar
。
第三步:運行調度中心
將jar包拷貝到服務器,執行:java -jar xxl-job-admin-${version}.jar
即可運行並啟動調度中心進程。
如果是在IDE中進行調試,可以在修改配置參數之后直接運行即可。
調度中心啟動成功之后,訪問:http://服務器主機地址:8080/xxl-job-admin
打開調度中心管理界面。
默認用戶名/密碼:admin/123456
任務執行器
任務執行器是跟具體業務綁定的程序邏輯,需要單獨開發。
xxl-job框架支持2種開發任務執行器的方式:
1.GLUE模式:在xxl-job管理后台動態編輯任務執行代碼並執行。
2.BEAN模式:這應該是使用得最多的方式,使用這種方式運行的執行器是一個需要獨立部署的程序。
GLUE模式任務執行器
略。
BEAN模式任務執行器
在官方給出的示例中,推薦使用基於Spring Boot框架開發任務執行器,詳細開發步驟如下:
1.新建基於Spring Boot框架的Maven項目(如果是在已經存在的Spring Boot項目中添加xxl-job任務執行器,這一步忽略)。
2.添加xxl-job核心依賴
<!-- https://mvnrepository.com/artifact/com.xuxueli/xxl-job-core -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
3.配置執行器運行參數
配置文件:src\main\resources\application.properties
需要配置的核心參數是2個:
(1)xxl.job.admin.addresses:調度中心地址
(2)xxl.job.executor.appname:任務執行器名稱,這個參數用於在調度中心注冊執行器
### 調度中心部署跟地址 [選填]:如調度中心集群部署存在多個地址則用逗號分隔。執行器將會使用該地址進行"執行器心跳注冊"和"任務結果回調";為空則關閉自動注冊;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### 執行器通訊TOKEN [選填]:非空時啟用;
xxl.job.accessToken=
### 執行器AppName [選填]:執行器心跳注冊分組依據;為空則關閉自動注冊
xxl.job.executor.appname=xxl-job-executor-test
### 執行器注冊 [選填]:優先使用該配置作為注冊地址,為空時使用內嵌服務 ”IP:PORT“ 作為注冊地址。從而更靈活的支持容器類型執行器動態IP和動態映射端口問題。
xxl.job.executor.address=
### 執行器IP [選填]:默認為空表示自動獲取IP,多網卡時可手動設置指定IP,該IP不會綁定Host僅作為通訊實用;地址信息用於 "執行器注冊" 和 "調度中心請求並觸發任務";
xxl.job.executor.ip=
### 執行器端口號 [選填]:小於等於0則自動獲取;默認端口為9999,單機部署多個執行器時,注意要配置不同執行器端口;
xxl.job.executor.port=9999
### 執行器運行日志文件存儲磁盤路徑 [選填] :需要對該路徑擁有讀寫權限;為空則使用默認路徑;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 執行器日志文件保存天數 [選填] : 過期日志自動清理, 限制值大於等於3時生效; 否則, 如-1, 關閉自動清理功能;
xxl.job.executor.logretentiondays=30
4.配置執行器組件
@Configuration
@Slf4j
public class JobExecutorConfig {
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.appname}")
private String appname;
@Value("${xxl.job.executor.address}")
private String address;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
// 將執行器組件配置Bean注入到Spring容器中
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
log.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;
}
}
5.編寫任務執行器方法
// 任務執行器類本身也需要注入到Spring容器中
@Component
public class SimpleJobHandler {
// 使用xxl-job-core提供的注解@XxlJob 標注這是一個執行器方法
@XxlJob("simpleHandler")
public void simpleHandler() throws InterruptedException {
XxlJobHelper.log("XXL-JOB, Hello World.");
for (int i = 0; i < 5; i++) {
XxlJobHelper.log("beat at:" + i);
TimeUnit.SECONDS.sleep(2);
}
// default success
}
}
6.啟動任務執行器
將任務執行器項目打包,部署到服務器啟動。
如果在IDE中開發調試,直接啟動即可。
至此,調度中心還不知道該任務執行器的存在,所以在調度中心創建定時任務時無法選擇該執行器,需要在調度中心手動添加該執行器。
回調調度中心管理界面,在左側菜單欄選擇【執行器管理】,單擊【新增】,在彈出框中輸入新創建的執行器信息:
- AppName:在執行器項目配置文件中設置的屬性
xxl.job.executor.appname
值,如:xxl-job-executor-test - 名稱:在執行器方法中使用注解
@XxlJob
指定的字符串名稱,如:simpleHandler - 注冊方式:自動注冊
點擊【保存】按鈕。
此時,就可以在調度中心的【執行器管理】界面中看到剛剛添加的任務執行器了。
通過上述步驟完成任務執行器在調度中心的注冊操作之后,就可以在調度中心添加定時任務時選擇對應的任務執行器了。
依賴的底層框架及核心技術
1.netty:提供http服務
https://github.com/netty/netty
2.Hessian
http://hessian.caucho.com
3.自研任務調度器
其他任務調度系統
https://github.com/PowerJob/PowerJob PowerJob