python任务调度平台 界面_分布式任务调度平台XXL-JOB搭建教程
關(guān)于分布式任務(wù)調(diào)度平臺(tái)XXL-JOB,其實(shí)作者 許雪里在其發(fā)布的中文教程中已經(jīng)介紹的很清楚了,這里我就不做過(guò)多的介紹了,關(guān)于其搭建教程,本人依照其文檔搭建起來(lái)基本上也沒(méi)遇到啥問(wèn)題,這里通過(guò)博客的形式記錄下來(lái)。
1、源碼下載地址
2、文檔地址
3、源碼結(jié)構(gòu)
通過(guò)上面給出的源碼下載地址,我們將源碼clone到IDEA中,如下:
4、初始化數(shù)據(jù)庫(kù)
初始化腳本在上面源碼目錄的??/doc/db/tables_xxl_job.sql ,將此腳本在MySQL數(shù)據(jù)庫(kù)中執(zhí)行一遍。
執(zhí)行完畢,會(huì)在MySQL數(shù)據(jù)庫(kù)中生成如下 16 張表:
5、配置調(diào)度中心
調(diào)度中心就是源碼中的 xxl-job-admin 工程,我們需要將其配置成自己需要的調(diào)度中心,通過(guò)該工程我們能夠以圖形化的方式統(tǒng)一管理任務(wù)調(diào)度平臺(tái)上調(diào)度任務(wù),負(fù)責(zé)觸發(fā)調(diào)度執(zhí)行。
①、修改調(diào)度中心配置文件
文件地址:/xxl-job/xxl-job-admin/src/main/resources/xxl-job-admin.properties
配置文件說(shuō)明:
1 ### 1、調(diào)度中心項(xiàng)目的端口號(hào)以及訪問(wèn)路徑2 server.port=8080
3 server.context-path=/xxl-job-admin4
5 ### 2、配置靜態(tài)文件的前綴6 spring.mvc.static-path-pattern=/static/**
7 spring.resources.static-locations=classpath:/static/8
9 ### 3、配置模板文件10 spring.freemarker.templateLoaderPath=classpath:/templates/11 spring.freemarker.suffix=.ftl12 spring.freemarker.charset=UTF-813 spring.freemarker.request-context-attribute=request14 spring.freemarker.settings.number_format=0.##########15
16 ### 4、配置mybatis的mapper文件地址17 mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml18
19 ### 5、配置數(shù)據(jù)庫(kù)的地址20 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-job?Unicode=true&characterEncoding=UTF-821 spring.datasource.username=root22 spring.datasource.password=root_pwd23 spring.datasource.driver-class-name=com.mysql.jdbc.Driver24
25 spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource26 spring.datasource.tomcat.max-wait=1000027 spring.datasource.tomcat.max-active=3028 spring.datasource.tomcat.test-on-borrow=true29 spring.datasource.tomcat.validation-query=SELECT 130 spring.datasource.tomcat.validation-interval=3000031
32 ### 6、配置報(bào)警郵箱33 spring.mail.host=smtp.qq.com34 spring.mail.port=2535 spring.mail.username=xxx@qq.com36 spring.mail.password=xxx37 spring.mail.properties.mail.smtp.auth=true38 spring.mail.properties.mail.smtp.starttls.enable=true39 spring.mail.properties.mail.smtp.starttls.required=true40
41
42 ### 7、管理界面的登錄用戶名密碼43 xxl.job.login.username=admin44 xxl.job.login.password=12345645
46 ### 8、調(diào)度中心通訊TOKEN,非空時(shí)啟用47 xxl.job.accessToken=48
49 ### 9、調(diào)度中心國(guó)際化設(shè)置,默認(rèn)為中文版本,值設(shè)置為“en”時(shí)切換為英文版本50 xxl.job.i18n=
注意:基本上上面的配置文件我們需要修改的只有第 5 點(diǎn),修改數(shù)據(jù)庫(kù)的地址,這要與我們前面初始化的數(shù)據(jù)庫(kù)名稱徑,用戶名密碼保持一致;
第二個(gè)就是修改第 6 點(diǎn),報(bào)警郵箱,因?yàn)樵摴こ倘蝿?wù)失敗后有失敗告警功能,可以通過(guò)郵件來(lái)提醒,如果我們需要此功能,可以配置一下。
②、部署調(diào)度中心
該工程是一個(gè)springboot項(xiàng)目,我們只需要在IDEA中執(zhí)行?XxlJobAdminApplication 類(lèi)即可運(yùn)行該工程:
③、訪問(wèn)調(diào)度中心管理界面
在瀏覽器輸入?http://localhost:8080/xxl-job-admin?然后輸入用戶名和密碼(前面配置文件中配置的),即可看到如下管理界面。
6、創(chuàng)建執(zhí)行器項(xiàng)目
其實(shí)在源碼中,作者提供了各個(gè)版本的 執(zhí)行器項(xiàng)目,下面我以創(chuàng)建一個(gè) springboot 版本的執(zhí)行器為例來(lái)介紹。
①、添加maven依賴
在創(chuàng)建好的springboot 項(xiàng)目的pom.xml 文件中添加如下依賴:
1
2
3 com.xuxueli
4 xxl-job-core
5 2.0.1
6
②、配置執(zhí)行器
在創(chuàng)建好的springboot 項(xiàng)目的配置文件 application.yml 添加如下配置:
1 server:2 #項(xiàng)目端口號(hào)3 port: 80814 logging:5 #日志文件6 config: classpath:logback.xml7
8 xxl:9 job:10 admin:11 #調(diào)度中心部署跟地址:如調(diào)度中心集群部署存在多個(gè)地址則用逗號(hào)分隔。12 #執(zhí)行器將會(huì)使用該地址進(jìn)行"執(zhí)行器心跳注冊(cè)"和"任務(wù)結(jié)果回調(diào)"。13 addresses: http://127.0.0.1:8080/xxl-job-admin14
15 #分別配置執(zhí)行器的名稱、ip地址、端口號(hào)16 #注意:如果配置多個(gè)執(zhí)行器時(shí),防止端口沖突17 executor:18 appname: executorDemo19 ip: 127.0.0.120 port: 999921
22 #執(zhí)行器運(yùn)行日志文件存儲(chǔ)的磁盤(pán)位置,需要對(duì)該路徑擁有讀寫(xiě)權(quán)限23 logpath: /data/applogs/xxl-job/jobhandler24 #執(zhí)行器Log文件定期清理功能,指定日志保存天數(shù),日志文件過(guò)期自動(dòng)刪除。限制至少保持3天,否則功能不生效;25 #-1表示永不刪除26 logretentiondays: -1
這里需要注意的是:配置執(zhí)行器的名稱、IP地址、端口號(hào),后面如果配置多個(gè)執(zhí)行器時(shí),要防止端口沖突。再就是執(zhí)行器的名稱,我們后面會(huì)到上一步的調(diào)度中心管理界面進(jìn)行對(duì)應(yīng)配置。
③、載入配置文件
在項(xiàng)目中創(chuàng)建 XxlJobConfig.class 文件:
1 packagecom.ys.xxljobexecutordemo.config;2
3 importcom.xxl.job.core.executor.impl.XxlJobSpringExecutor;4 importorg.slf4j.Logger;5 importorg.slf4j.LoggerFactory;6 importorg.springframework.beans.factory.annotation.Value;7 importorg.springframework.context.annotation.Bean;8 importorg.springframework.context.annotation.Configuration;9
10 /**
11 * Create by YSOcean12 */
13 @Configuration14 public classXxlJobConfig {15 private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);16
17 @Value("${xxl.job.admin.addresses}")18 privateString adminAddresses;19
20 @Value("${xxl.job.executor.appname}")21 privateString appName;22
23 @Value("${xxl.job.executor.ip}")24 privateString ip;25
26 @Value("${xxl.job.executor.port}")27 private intport;28
29 @Value("${xxl.job.accessToken}")30 privateString accessToken;31
32 @Value("${xxl.job.executor.logpath}")33 privateString logPath;34
35 @Value("${xxl.job.executor.logretentiondays}")36 private intlogRetentionDays;37
38
39 @Bean(initMethod = "start", destroyMethod = "destroy")40 publicXxlJobSpringExecutor xxlJobExecutor() {41 logger.info(">>>>>>>>>>> xxl-job config init.");42 XxlJobSpringExecutor xxlJobSpringExecutor = newXxlJobSpringExecutor();43 xxlJobSpringExecutor.setAdminAddresses(adminAddresses);44 xxlJobSpringExecutor.setAppName(appName);45 xxlJobSpringExecutor.setIp(ip);46 xxlJobSpringExecutor.setPort(port);47 xxlJobSpringExecutor.setAccessToken(accessToken);48 xxlJobSpringExecutor.setLogPath(logPath);49 xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);50
51 returnxxlJobSpringExecutor;52 }53
54 }
View Code
④、創(chuàng)建任務(wù)JobHandler
在項(xiàng)目中創(chuàng)建一個(gè)Handler,用于執(zhí)行我們想要執(zhí)行的東西,這里我只是簡(jiǎn)單的打印一行日志:
XXL-JOB, Hello World!!!
1 packagecom.ys.xxljobexecutordemo.jobhandler;2
3 importcom.xxl.job.core.biz.model.ReturnT;4 importcom.xxl.job.core.handler.IJobHandler;5 importcom.xxl.job.core.handler.annotation.JobHandler;6 importcom.xxl.job.core.log.XxlJobLogger;7 importorg.springframework.stereotype.Component;8
9 /**
10 * 任務(wù)Handler示例(Bean模式)11 *12 * 開(kāi)發(fā)步驟:13 * 1、繼承"IJobHandler":“com.xxl.job.core.handler.IJobHandler”;14 * 2、注冊(cè)到Spring容器:添加“@Component”注解,被Spring容器掃描為Bean實(shí)例;15 * 3、注冊(cè)到執(zhí)行器工廠:添加“@JobHandler(value="自定義jobhandler名稱")”注解,注解value值對(duì)應(yīng)的是調(diào)度中心新建任務(wù)的JobHandler屬性的值。16 * 4、執(zhí)行日志:需要通過(guò) "XxlJobLogger.log" 打印執(zhí)行日志;17 */
18 @JobHandler(value="demoJobHandler")19 @Component20 public class JobHandlerDemo extendsIJobHandler{21 @Override22 public ReturnT execute(String s) throwsException {23 XxlJobLogger.log("XXL-JOB, Hello World.");24 returnSUCCESS;25 }26 }
View Code
注意:這里有個(gè)注解?@JobHandler(value="demoJobHandler"),對(duì)于 value的值,我們會(huì)在下面進(jìn)行相應(yīng)配置。
7、在調(diào)度中心中配置執(zhí)行器
①、配置執(zhí)行器
點(diǎn)擊? 執(zhí)行器管理----》新增執(zhí)行器---》,如下如下界面,然后填充此表格,點(diǎn)擊保存即可。
下面是對(duì)這幾個(gè)參數(shù)的介紹:
AppName:是每個(gè)執(zhí)行器集群的唯一標(biāo)示AppName, 執(zhí)行器會(huì)周期性以AppName為對(duì)象進(jìn)行自動(dòng)注冊(cè)。可通過(guò)該配置自動(dòng)發(fā)現(xiàn)注冊(cè)成功的執(zhí)行器, 供任務(wù)調(diào)度時(shí)使用;
名稱:執(zhí)行器的名稱, 因?yàn)锳ppName限制字母數(shù)字等組成,可讀性不強(qiáng), 名稱為了提高執(zhí)行器的可讀性;
排序: 執(zhí)行器的排序, 系統(tǒng)中需要執(zhí)行器的地方,如任務(wù)新增, 將會(huì)按照該排序讀取可用的執(zhí)行器列表;
注冊(cè)方式:調(diào)度中心獲取執(zhí)行器地址的方式,
自動(dòng)注冊(cè):執(zhí)行器自動(dòng)進(jìn)行執(zhí)行器注冊(cè),調(diào)度中心通過(guò)底層注冊(cè)表可以動(dòng)態(tài)發(fā)現(xiàn)執(zhí)行器機(jī)器地址;
手動(dòng)錄入:人工手動(dòng)錄入執(zhí)行器的地址信息,多地址逗號(hào)分隔,供調(diào)度中心使用;
機(jī)器地址:"注冊(cè)方式"為"手動(dòng)錄入"時(shí)有效,支持人工維護(hù)執(zhí)行器的地址信息;
②、創(chuàng)建任務(wù)
點(diǎn)擊 任務(wù)管理---》新增任務(wù)---》
執(zhí)行器:任務(wù)的綁定的執(zhí)行器,任務(wù)觸發(fā)調(diào)度時(shí)將會(huì)自動(dòng)發(fā)現(xiàn)注冊(cè)成功的執(zhí)行器, 實(shí)現(xiàn)任務(wù)自動(dòng)發(fā)現(xiàn)功能; 另一方面也可以方便的進(jìn)行任務(wù)分組。每個(gè)任務(wù)必須綁定一個(gè)執(zhí)行器, 可在 "執(zhí)行器管理" 進(jìn)行設(shè)置。
任務(wù)描述:任務(wù)的描述信息,便于任務(wù)管理;
路由策略:當(dāng)執(zhí)行器集群部署時(shí),提供豐富的路由策略,包括;
FIRST(第一個(gè)):固定選擇第一個(gè)機(jī)器;
LAST(最后一個(gè)):固定選擇最后一個(gè)機(jī)器;
ROUND(輪詢):;
RANDOM(隨機(jī)):隨機(jī)選擇在線的機(jī)器;
CONSISTENT_HASH(一致性HASH):每個(gè)任務(wù)按照Hash算法固定選擇某一臺(tái)機(jī)器,且所有任務(wù)均勻散列在不同機(jī)器上。
LEAST_FREQUENTLY_USED(最不經(jīng)常使用):使用頻率最低的機(jī)器優(yōu)先被選舉;
LEAST_RECENTLY_USED(最近最久未使用):最久為使用的機(jī)器優(yōu)先被選舉;
FAILOVER(故障轉(zhuǎn)移):按照順序依次進(jìn)行心跳檢測(cè),第一個(gè)心跳檢測(cè)成功的機(jī)器選定為目標(biāo)執(zhí)行器并發(fā)起調(diào)度;
BUSYOVER(忙碌轉(zhuǎn)移):按照順序依次進(jìn)行空閑檢測(cè),第一個(gè)空閑檢測(cè)成功的機(jī)器選定為目標(biāo)執(zhí)行器并發(fā)起調(diào)度;
SHARDING_BROADCAST(分片廣播):廣播觸發(fā)對(duì)應(yīng)集群中所有機(jī)器執(zhí)行一次任務(wù),同時(shí)系統(tǒng)自動(dòng)傳遞分片參數(shù);可根據(jù)分片參數(shù)開(kāi)發(fā)分片任務(wù);
Cron:觸發(fā)任務(wù)執(zhí)行的Cron表達(dá)式;
運(yùn)行模式:
BEAN模式:任務(wù)以JobHandler方式維護(hù)在執(zhí)行器端;需要結(jié)合 "JobHandler" 屬性匹配執(zhí)行器中任務(wù);
GLUE模式(Java):任務(wù)以源碼方式維護(hù)在調(diào)度中心;該模式的任務(wù)實(shí)際上是一段繼承自IJobHandler的Java類(lèi)代碼并 "groovy" 源碼方式維護(hù),它在執(zhí)行器項(xiàng)目中運(yùn)行,可使用@Resource/@Autowire注入執(zhí)行器里中的其他服務(wù);
GLUE模式(Shell):任務(wù)以源碼方式維護(hù)在調(diào)度中心;該模式的任務(wù)實(shí)際上是一段 "shell" 腳本;
GLUE模式(Python):任務(wù)以源碼方式維護(hù)在調(diào)度中心;該模式的任務(wù)實(shí)際上是一段 "python" 腳本;
GLUE模式(PHP):任務(wù)以源碼方式維護(hù)在調(diào)度中心;該模式的任務(wù)實(shí)際上是一段 "php" 腳本;
GLUE模式(NodeJS):任務(wù)以源碼方式維護(hù)在調(diào)度中心;該模式的任務(wù)實(shí)際上是一段 "nodejs" 腳本;
GLUE模式(PowerShell):任務(wù)以源碼方式維護(hù)在調(diào)度中心;該模式的任務(wù)實(shí)際上是一段 "PowerShell" 腳本;
JobHandler:運(yùn)行模式為 "BEAN模式" 時(shí)生效,對(duì)應(yīng)執(zhí)行器中新開(kāi)發(fā)的JobHandler類(lèi)“@JobHandler”注解自定義的value值;
阻塞處理策略:調(diào)度過(guò)于密集執(zhí)行器來(lái)不及處理時(shí)的處理策略;
單機(jī)串行(默認(rèn)):調(diào)度請(qǐng)求進(jìn)入單機(jī)執(zhí)行器后,調(diào)度請(qǐng)求進(jìn)入FIFO隊(duì)列并以串行方式運(yùn)行;
丟棄后續(xù)調(diào)度:調(diào)度請(qǐng)求進(jìn)入單機(jī)執(zhí)行器后,發(fā)現(xiàn)執(zhí)行器存在運(yùn)行的調(diào)度任務(wù),本次請(qǐng)求將會(huì)被丟棄并標(biāo)記為失敗;
覆蓋之前調(diào)度:調(diào)度請(qǐng)求進(jìn)入單機(jī)執(zhí)行器后,發(fā)現(xiàn)執(zhí)行器存在運(yùn)行的調(diào)度任務(wù),將會(huì)終止運(yùn)行中的調(diào)度任務(wù)并清空隊(duì)列,然后運(yùn)行本地調(diào)度任務(wù);
子任務(wù):每個(gè)任務(wù)都擁有一個(gè)唯一的任務(wù)ID(任務(wù)ID可以從任務(wù)列表獲取),當(dāng)本任務(wù)執(zhí)行結(jié)束并且執(zhí)行成功時(shí),將會(huì)觸發(fā)子任務(wù)ID所對(duì)應(yīng)的任務(wù)的一次主動(dòng)調(diào)度。
任務(wù)超時(shí)時(shí)間:支持自定義任務(wù)超時(shí)時(shí)間,任務(wù)運(yùn)行超時(shí)將會(huì)主動(dòng)中斷任務(wù);
失敗重試次數(shù);支持自定義任務(wù)失敗重試次數(shù),當(dāng)任務(wù)失敗時(shí)將會(huì)按照預(yù)設(shè)的失敗重試次數(shù)主動(dòng)進(jìn)行重試;
報(bào)警郵件:任務(wù)調(diào)度失敗時(shí)郵件通知的郵箱地址,支持配置多郵箱地址,配置多個(gè)郵箱地址時(shí)用逗號(hào)分隔;
負(fù)責(zé)人:任務(wù)的負(fù)責(zé)人;
執(zhí)行參數(shù):任務(wù)執(zhí)行所需的參數(shù),多個(gè)參數(shù)時(shí)用逗號(hào)分隔,任務(wù)執(zhí)行時(shí)將會(huì)把多個(gè)參數(shù)轉(zhuǎn)換成數(shù)組傳入;
8、啟動(dòng)任務(wù)
配置完執(zhí)行器以及任務(wù),我們只需要啟動(dòng)該任務(wù),便可以運(yùn)行了。
啟動(dòng)之后,我們查看日志:
我們上面配置任務(wù)時(shí)的cron表達(dá)式是每秒鐘執(zhí)行一次(0/1 * * * * ? *):
打印日志如下:
注意:在項(xiàng)目中,只有通過(guò)?XxlJobLogger.log() 代碼才能將日志打印到上面。
總結(jié)
以上是生活随笔為你收集整理的python任务调度平台 界面_分布式任务调度平台XXL-JOB搭建教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: bigdecimal判断等于0_shel
- 下一篇: 热血上头!程序员想拍桌子离职的1000个