分佈式job配置中心
相當於註冊中心,每個需要跑定時任務的微服務都需要自動或者手動註冊到上面。
管理後臺
執行器管理,任務管理,調度日誌,可以查看某個job的執行狀況。
多個任務Handler,配置一個端口。一個執行器中可以包含多個Handler,把當前項目註冊到分佈式job管理中心,成爲一個執行器。
1)一個項目中包含多個Handler任務;
一個執行器中可能會配置多個任務。每一個handler都是任務;每個項目都是一個執行器。
分佈式調度中心xxl-job——The timestamp difference between admin and executor exceeds the limit.
這是一個時鐘同步問題;調度中心和任務執行器需要時間同步,同步時間誤差需要在3分鐘內,否則拋出異常。
時區問題
任務由調度中心觸發,按照在調度中心設置任務的cron表達式觸發時,需要注意部署調度中心的機器所在的時區,按照該時區定製化cron表達式。
cron表達式
//整點開始執行,每小時執行一次;
@Scheduled(cron = "0 0 0/1 * * ?")
//零點開始執行,只執行一次;
@Scheduled(cron = "0 0 0 * * ?")
必須使用分佈式job框架配置定時任務,便於對定時任務進行管理
1、不能使用setNX處理,要不然每次停止定時job都要重新發布服務,發佈的成本太高。
2、醫生表的定時任務,一般是慢sql,現在要停掉,只能重新啓動。
1、定時job如何進行測試?
2、每個配置都是什麼意思?
3、啓動運行下,看看代碼會不會執行,job中有執行日誌的?
4、把執行器自動註冊到任務管理上;
安裝:
分佈式job整體使用一個數據庫,直接把所有的sql語句執行即可。
管理後臺:直接編譯admin項目,然後把jar包運行在指定的機器上就即可。
寫一下xxl-job接入文檔即可,但是要防止端口重複。
Cron表達式理解:時間域
1、*:表示匹配該域的任意值。假如在Minutes域使用*, 即表示每分鐘都會觸發事件。
如果想要每分鐘,每天都觸發,就使用*。
2、其七位時間域,如果只有六位,說明沒有年,倒數第二位是周;
3、/:表示起始時間開始觸發,然後每隔固定時間觸發一次。例如在Minutes域使用5/20,則意味第5分鐘開始觸發一次,然後每隔20分鐘觸發一次。.
依賴包
<dependency>
<groupId>com.corundumstudio.socketio</groupId>
<artifactId>netty-socketio</artifactId>
<version>1.7.17</version>
</dependency>
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.1.0</version>
</dependency>
JobHandler開發:請基於SpringBoot來開發新的JobHandler實例(定時任務處理器)。
修改配置:
修改application-xxx.properties 或 bootstrap-xxx.properties文件(注意:直接配置在項目中,不要在gitlab中配置):
下面是一個配置模板,有變動的配置項只有一項,其他配置項各個環境都一樣直接copy就好:
xxl.job.admin.addresses=http://192.168.110.124:7899/job (注意:不同環境的管理後臺地址不同)
# 控制器地址:服務啓動時,自動把當前服務自動註冊到控制器中
xxl.job.admin.addresses=http://192.168.110.124:7899/job
#執行器命名規則job-exec-<申請Port> 需要向管理員申請,防止端口重複。
xxl.job.executor.appname=job-exec-<申請Port>
xxl.job.executor.ip=
xxl.job.executor.port=<申請Port>
### xxl-job, access token 可以不用配置
xxl.job.accessToken=
### 確保改目錄可寫/opt/xxl-job-logs/jobhandler
xxl.job.executor.logpath=/opt/xxl-job-logs/jobhandler
### xxl-job log retention days
xxl.job.executor.logretentiondays=-1
生產環境,因爲要保持分佈式調度中心高可用,所以配置了兩臺機器。
聲明配置Bean
在項目中添加一個Configuration (JobExecutorConfiguration.java) ,讀取配置文件中的配置。
@Configuration
public class JobExecutorConfiguration {
private Logger logger = LoggerFactory.getLogger(JobExecutorConfiguration.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.executor.appname}")
private String appName;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean(initMethod = "start", destroyMethod = "destroy")
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info("pica-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;
}
}
JobHandler
開發JobHandler Bean,execute方法中執行業務邏輯
JobHandler必須在項目中唯一,使用Full Class name (Namespace + className)
JobHandler命名規則:
* 開發步驟:
* 1、繼承"IJobHandler",全類名“com.xxl.job.core.handler.IJobHandler”;
* 2、註冊到Spring容器:添加“@Component”註解,被Spring容器掃描爲Bean實例;
* 3、註冊到執行器工廠:添加“@JobHandler(value="自定義jobhandler名稱")”註解,註解value值對應的是調度中心新建任務的JobHandler屬性的值。
* 4、執行日誌:需要通過 "XxlJobLogger.log" 打印執行日誌;
@JobHandler(value="PingHandler")
@Component
public class PingHandler extends IJobHandler {
@Override
public ReturnT<String> execute(String param) throws Exception {
XxlJobLogger.log("XXL-JOB, Hello World.");
for (int i = 0; i < 5; i++) {
XxlJobLogger.log("test14JobHandler beat at:" + i);
TimeUnit.SECONDS.sleep(2);
}
return SUCCESS;
}
}
需要注意以下幾點:
1、@JobHandler(value="PingHandler") value 與類名保持一致
2、一個類只能有一個JobHandler
通過以上三步JobHandler開發完畢。 接下來配置調度器。
Job 調度器管理地址
username/password: guest / 123456
dev: http://192.168.110.124:7899/job/
test1: http://192.168.110.133:7899/job/
uat: http://192.168.110.141:7899/job/
管理後臺配置
STEP 01:新增執行器
相同名稱的執行器被認爲是同一個執行器,執行器與JobHandler是一對多的關係,控制中心通過一個執行器調度多個JobHandler。
AppName:job-executor-${server.port} ,必須與 bootstrap-xxx.properties 配置文件中的 xxl.job.executor.appname 配置項一致。
名稱:${server.port}-exec
JobHandler 所在的服務啓動後,執行器會自動註冊到控制中心。
STEP 02:11904-exec執行器下添加JobHandler
Cron 表達式生成地址:http://cron.qqe2.com/
JobHandler來自:@JobHandler(value="PingHandler")
STEP 03: 任務執行與啓動
注意:STEP 02 中添加JobHandler 默認狀態爲STOP,這意味着這個Job沒有啓動,永遠也不會被執行。這裏我們需要手動啓動它,啓動後的Job狀態爲RUNNING,Job會按照Cron週期執行。
STEP04:查看Log
當前job是否成功執行。
什麼是任務調度?
任務調度:在單位時間內,去調用某個方法或者執行某段代碼。
實現方式:
1、使用springboot自帶的定時任務。
2、使用quartz;
以上都是可以解決任務調度的方法,但在實際項目中,一般都是使用第三方quartz實現任務調度功能,既然已經有了quartz爲什麼還需要使用xxl-job呢?
爲解決分佈式環境下定時任務的可靠性,穩定性,只執行一次的特性,找到了個大衆點評開源的分佈式調度任務解決完整系統。
下載:https://github.com/xuxueli/xxl-job ,該項目目前更新仍然活躍,我使用的是1.9.1版本。
要新建一個定時任務,新建一個任務處理器。
只需要繼承IJobHandler,實現其方法,添加兩個註解Component和JobHandler,value=testJobHandler表示在調度中心需要配置的任務JobHandler。
分佈式job管理中心地址和端口
appname名字調度中心會配置,寫相同即可
# 表示此執行器地址,也就是本項目部署地址 xxl.job.executor.ip=172.16.100.141 # 提供jetty連接的端口,不要衝突即可,在調度中心會配置此項 xxl.job.executor.port=9999
運行報表:任務數量,調度次數(調度中心出發的調度次數),執行器數量。
執行器。在任務管理選項中添加任務。(執行器管理,任務管理)
任務執行的日誌,會打印在log面板上。
分佈式調度任務。
特徵:
動態:支持動態修改任務狀態、暫停/恢復任務,以及終止運行中任務,即時生效;
調度中心HA(中心式):調度採用中心式設計,“調度中心”基於集羣Quartz實現並支持集羣部署,可保證調度中心HA;
執行器HA(分佈式):任務分佈式執行,任務"執行器"支持集羣部署,可保證任務執行HA;
註冊中心: 執行器會週期性自動註冊任務, 調度中心將會自動發現註冊的任務並觸發執行。同時,也支持手動錄入執行器地址。
彈性擴容縮容:一旦有新執行器機器上線或者下線,下次調度時將會重新分配任務。
路由策略:執行器集羣部署時提供豐富的路由策略,包括:第一個、最後一個、輪詢、隨機、一致性HASH、最不經常使用、最近最久未使用、故障轉移、忙碌轉移等;
故障轉移:任務路由策略選擇"故障轉移"情況下,如果執行器集羣中某一臺機器故障,將會自動Failover切換到一臺正常的執行器發送調度請求。
阻塞處理策略:調度過於密集,執行器來不及處理時的處理策略,策略包括:單機串行(默認)、丟棄後續調度、覆蓋之前調度;
任務超時控制:支持自定義任務超時時間,任務運行超時將會主動中斷任務;
任務失敗重試:支持自定義任務失敗重試次數,當任務失敗時將會按照預設的失敗重試次數主動進行重試;
失敗處理策略:調度失敗時的處理策略,默認提供失敗告警、失敗重試等策略;
任務進度監控:支持實時監控任務進度;
Rolling實時日誌:支持在線查看調度結果,並且支持以Rolling方式實時查看執行器輸出的完整的執行日誌;
一致性:“調度中心”通過DB鎖保證集羣分佈式調度的一致性, 一次任務調度只會觸發一次執行;
數據加密:調度中心和執行器之間的通訊進行數據加密,提升調度信息安全性;
郵件報警:任務失敗時支持郵件報警,支持配置多郵件地址羣發報警郵件;
推送maven中央倉庫: 將會把最新穩定版推送到maven中央倉庫, 方便用戶接入和使用;
運行報表:支持實時查看運行數據,如任務數量、調度次數、執行器數量等;以及調度報表,如調度日期分佈圖,調度成功分佈圖等;
項目開發中,常常以下場景需要分佈式任務調度:
1、同一服務多個實例的任務存在互斥時,需要統一協調;
2、定時任務的執行需要支持高可用、監控運維、故障告警;
3、需要統一管理和追蹤各個服務節點定時任務的運行情況,以及任務屬性信息,例如任務所屬服務、所屬責任人
因此,XXL-JOB應運而生: XXL-JOB是一個開源的輕量級分佈式任務調度平臺,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展、開箱即用,其中“XXL”是主要作者,大衆點評許雪裏名字的縮寫。
執行原理
1、任務執行器根據配置的調度中心的地址,自動註冊到調度中心
2、達到任務觸發條件,調度中心下發任務
3、執行器基於線程池執行任務,並把執行結果放入內存隊列中、把執行日誌寫入日誌文件中
4、執行器的回調線程消費內存隊列中的執行結果,主動上報給調度中心
5、當用戶在調度中心查看任務日誌,調度中心請求任務執行器,任務執行器讀取任務日誌文件並返回日誌詳情。
https://www.liangzl.com/get-article-detail-148205.html