目錄
一、什么是XXL-JOB?
??XXL-JOB是一個輕量級分布式任務調度框架,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。現已開放源代碼并接入多家公司線上產品線,開箱即用。
??選型時原則:少服務器 后期維護方便 增加任務省事而且快捷 不涉及啟停服務
????優點:支持集群部署
????缺點:沒有自帶的管理界面;調度邏輯和執行任務耦合在一起;維護需要重啟服務
????總結:針對目前項目情況,利弊相同
????優點:支持集群部署;提供運維界面維護成本小;自帶錯誤預警;相對elastic-job來說不需要額外的組件(zookeeper);支持調度策略;支持分片;文檔齊全
????缺點:相對Quartz來說需要多部署調度中心
????總結:針對目前項目情況,利大于弊
????優點:支持集群部署;維護成本小
????缺點:elastic-job 需要 zookeeper,zookeeper 集群高可用至少需要三臺服務器
????總結:針對目前項目情況,弊大于利
??小結:綜合選型原則及三個定時任務框架的優缺點和目前項目的狀況,建議選用xxl-job。
三、XXL-JOB的一些特性:
??1、執行失敗可以查看日志
??2、支持郵件報警
??3、路由策略支持輪詢等策略,可以減輕執行服務器的壓力
??4、輪詢時間等參數修改后立即生效
??5、執行器有問題或新增,快速識別
??6、調度中心高可用,調度中心可以集群部署(集群部署的機器時鐘必須同步),如果調度中心沒有做負載在執行器的配置中需要配多個地址,如果調度中心配置負載則執行器配置負載地址即可
??7、執行器高可用(執行器可以集群部署)
四、XXL-JOB與項目結合
??以 springboot 框架為例:
<!--定時器xxljob-->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
2.0.1
</dependency>? ? ? ?
??在 resources 文件夾下新建配置文件 application.properties
### xxl-job admin address list, such as"http://address"or"http://address01,http://address02"
xxl.job.admin.addresses=192.168.22.67:8080/xxl-job-admin/
### xxl-job executor address
xxl.job.executor.appname=xxl-job-executor-sample
xxl.job.executor.ip=192.168.21.88
xxl.job.executor.port=9977
### xxl-job, access token
xxl.job.accessToken=/data/applogs/xxl-job/jobhandler/
### xxl-job log path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### xxl-job log retention days
xxl.job.executor.logretentiondays=-1
??XXL-JOB執行器的相關配置項的意義,如下所示:
xxl.job.admin.addresses
調度中心的部署地址。若調度中心采用集群部署,存在多個地址,則用逗號分隔。執行器將會使用該地址進行”執行器心跳注冊”和”任務結果回調”。
xxl.job.executor.appname
執行器的應用名稱,它是執行器心跳注冊的分組依據。
xxl.job.executor.ip
執行器的IP地址,用于”調度中心請求并觸發任務”和”執行器注冊”。執行器IP默認為空,表示自動獲取IP。多網卡時可手動設置指定IP,手動設置IP時將會綁定Host。
xxl.job.executor.port
執行器的端口號,默認值為9999。單機部署多個執行器時,注意要配置不同的執行器端口。
xxl.job.accessToken
執行器的通信令牌,非空時啟用。
xxl.job.executor.logpath
執行器輸出的日志文件的存儲路徑,需要擁有該路徑的讀寫權限。
xxl.job.executor.logretentiondays
執行器日志文件的定期清理功能,指定日志保存天數,日志文件過期自動刪除。限制至少保存3天,否則功能不生效。
??注意,XXL-JOB執行器的配置文件也可以交給Disconf進行托管。
??新建一個執行器配置類,用來讀取執行器的配置信息。在config文件夾下新建一個名為 XxlJobConfig?的類,內容如下:
packagecom.tfjybj.physical.config;
importcom.xxl.job.core.executor.XxlJobExecutor;
importcom.xxl.job.core.executor.impl.XxlJobSpringExecutor;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.beans.factory.annotation.Value;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.ComponentScan;
importorg.springframework.context.annotation.Configuration;
/**
* xxl-job config
*
*@authorxuxueli 2017-04-28
*/
@Configuration
@ComponentScan(basePackages = "com.tfjybj.physical.provider.job")
publicclassXxlJobConfig{
privateLogger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
privateString adminAddresses;
@Value("${xxl.job.executor.appname}")
privateString appName;
@Value("${xxl.job.executor.ip}")
privateString ip;
@Value("${xxl.job.executor.port}")
privateintport;
@Value("${xxl.job.accessToken}")
privateString accessToken;
@Value("${xxl.job.executor.logpath}")
privateString logPath;
@Value("${xxl.job.executor.logretentiondays}")
privateintlogRetentionDays;
@Bean(initMethod = "start", destroyMethod = "destroy")
publicXxlJobSpringExecutorxxlJobExecutor(){
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor? xxlJobSpringExecutor? =newXxlJobSpringExecutor ();
? ? ? ? xxlJobSpringExecutor .setAdminAddresses(adminAddresses);
? ? ? ? xxlJobSpringExecutor .setAppName(appName);
? ? ? ? xxlJobSpringExecutor .setIp(ip);
? ? ? ? xxlJobSpringExecutor .setPort(port);
? ? ? ? xxlJobSpringExecutor .setAccessToken(accessToken);
? ? ? ? xxlJobSpringExecutor .setLogPath(logPath);
? ? ? ? xxlJobSpringExecutor .setLogRetentionDays(logRetentionDays);
returnxxlJobSpringExecutor ;
? ? }
}
XxlJobConfig?配置類有兩點需要注意:
組件掃描使用?@ComponentScan?注解,掃描 com.example.demo.jobhandler 包,將其中的任務處理器加載至 Spring 容器。
獲取執行器實例 xxlJobExecutor() 方法會實例化一個 XXL-JOB 執行器對象,執行器初始化時調用它的 start() 方法,執行器銷毀時調用它的?destroy()?方法。
??在 provider 下的 job 下新建 job 測試文件:JobTest.java
packagecom.tfjybj.physical.provider.job;
importcom.xxl.job.core.biz.model.ReturnT;
importcom.xxl.job.core.handler.IJobHandler;
importcom.xxl.job.core.handler.annotation.JobHandler;
importlombok.extern.slf4j.Slf4j;
importorg.springframework.stereotype.Component;
importjava.io.Serializable;
@JobHandler(value = "JobTest")
@Component
@Slf4j
publicclassJobTestextendsIJobHandlerimplementsSerializable{
@Override
publicReturnTexecute(String s)throwsException{
try{
System.out.println("測試~~~");
/*測試數據*/
returnSUCCESS;
}catch(Exception e){
? ? ? ? ? ? e.printStackTrace();
returnFAIL;
? ? ? ? }
? ? }
}
訪問地址:http://192.168.22.67:8080/xxl-job-admin/jobinfo,登錄 XXL-JOB 調度中心
??新增任務,更新任務:
??新增執行器:
注意,AppName的取值應該和示例工程的?application.properties?文件中的?xxl.job.executor.appname?字段的取值相同,注冊方式應該選擇自動注冊。