天天看點

1分鐘上手xxl-job分布式排程平台

作者:不開心就撸代碼

關注我,每天都是幹貨滿滿

一、簡介

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

二、部署 XXL-JOB

1. 下載下傳 xxl-job 源碼

解壓

2. 建立資料庫執行sql腳本

1分鐘上手xxl-job分布式排程平台

3. 修改 xxl-job-admin 配置檔案

1分鐘上手xxl-job分布式排程平台

4. 啟動 xxl-job-admin 項目

通路:

使用者名:admin

密碼:123456

1分鐘上手xxl-job分布式排程平台

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) 在控制台新增執行器、新增任務後啟動

結語:

不順利嗎? 多照照鏡子,很多事情你就明白原因了。

繼續閱讀