關注我,每天都是幹貨滿滿
一、簡介
XXL-JOB 是一個分布式任務排程平台,其核心設計目标是開發迅速、學習簡單、輕量級、易擴充。現已開放源代碼并接入多家公司線上産品線,開箱即用。
二、部署 XXL-JOB
1. 下載下傳 xxl-job 源碼
解壓
2. 建立資料庫執行sql腳本
3. 修改 xxl-job-admin 配置檔案
4. 啟動 xxl-job-admin 項目
通路:
使用者名:admin
密碼:123456
5. Spring Boot 整合 XXL-JOB
(1) 引入 XXL-JOB 依賴
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.1</version>
</dependency>
(2) application配置檔案
# 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:8080/xxl-job-admin
# 執行器通訊TOKEN [選填]:非空時啟用;
### xxl-job, access token
xxl.job.accessToken=default_token
# 執行器AppName [選填]:執行器心跳注冊分組依據;為空則關閉自動注冊
### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-sample
# 執行器注冊 [選填]:優先使用該配置作為注冊位址,為空時使用内嵌服務 ”IP:PORT“ 作為注冊位址。進而更靈活的支援容器類型執行器動态IP和動态映射端口問題。
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address=
# 執行器IP [選填]:預設為空表示自動擷取IP,多網卡時可手動設定指定IP,該IP不會綁定Host僅作為通訊實用;位址資訊用于 "執行器注冊" 和 "排程中心請求并觸發任務";
### xxl-job executor server-info
xxl.job.executor.ip=
# 執行器端口号 [選填]:小于等于0則自動擷取;預設端口為9999,單機部署多個執行器時,注意要配置不同執行器端口;
xxl.job.executor.port=9997
# 執行器運作日志檔案存儲磁盤路徑 [選填] :需要對該路徑擁有讀寫權限;為空則使用預設路徑;
### xxl-job executor log-path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
# 執行器日志檔案儲存天數 [選填] : 過期日志自動清理, 限制值大于等于3時生效; 否則, 如-1, 關閉自動清理功能;
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30
(3) 編寫配置類
@Configuration
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@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
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setAddress(address);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
(4) 編寫定時任務
@Component
public class SampleXxlJob {
/**
* 1、簡單任務示例(Bean模式)
*/
@XxlJob("test1")
public void demoJobHandler() throws Exception {
System.out.println("基本任務啟動。。。。");
for (int i = 0; i < 5; i++) {
System.out.println("beat at:" + i);
TimeUnit.SECONDS.sleep(2);
}
}
/**
* 2、分片廣播任務
*/
@XxlJob("shardingJobHandler2")
public void shardingJobHandler() throws Exception {
// 分片參數
int shardIndex = XxlJobHelper.getShardIndex();
int shardTotal = XxlJobHelper.getShardTotal();
System.out.println("分片參數:目前分片序号 = "+shardIndex+", 總分片數 = "+shardTotal);
// 業務邏輯
for (int i = 0; i < shardTotal; i++) {
if (i == shardIndex) {
System.out.println("第 "+i+" 片, 命中分片開始處理");
} else {
System.out.println("第 "+1+ "片, 忽略");
}
}
}
}
(5) 在控制台新增執行器、新增任務後啟動
結語:
不順利嗎? 多照照鏡子,很多事情你就明白原因了。