一、搭建xxl-job
1、下載xxl-job代碼
碼雲地址:https://gitee.com/xuxueli0323/xxl-job
gitHub地址:https://github.com/xuxueli/xxl-job
2、執行SQL
在數據庫執行 \xxl-job\doc\db\tables_xxl_job.sql
3、導入idea
導入已存在的模塊:File--New--Module from Existing Sources...
選擇pom文件,直接導入
4、修改配置文件
修改配置文件:xxl-job\xxl-job-admin\src\main\resources\application.properties
調整數據庫連接、控制台用戶名密碼等內容
此處特別說明一點,郵箱配置的password並不是郵箱密碼,而是郵箱的授權碼(授權碼獲取步驟自己百度),如果配置成郵箱密碼,當定時任務異常需要發郵件時,會出現郵件發送535錯誤。
### 調度中心項目的端口號以及訪問路徑 server.port=8081 server.context-path=/xxl-job-admin ### 配置靜態文件的前綴 spring.mvc.static-path-pattern=/static/** spring.resources.static-locations=classpath:/static/ ### 配置模板文件 spring.freemarker.templateLoaderPath=classpath:/templates/ spring.freemarker.suffix=.ftl spring.freemarker.charset=UTF-8 spring.freemarker.request-context-attribute=request spring.freemarker.settings.number_format=0.########## ### 配置mybatis的mapper文件地址 mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml ### 配置數據庫的地址 spring.datasource.url=jdbc:mysql://***:3306/xxl_job?Unicode=true&characterEncoding=UTF-8 spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource spring.datasource.tomcat.max-wait=10000 spring.datasource.tomcat.max-active=30 spring.datasource.tomcat.test-on-borrow=true spring.datasource.tomcat.validation-query=SELECT 1 spring.datasource.tomcat.validation-interval=30000 ### 配置報警郵箱 spring.mail.host=smtp.qq.com spring.mail.port=25 spring.mail.username=xxx@qq.com spring.mail.password=xxx spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.required=true spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory ### 調度中心通訊TOKEN,非空時啟用 xxl.job.accessToken= ### 調度中心國際化設置,默認為中文版本,值設置為“en”時切換為英文版本 xxl-job, i18n (default empty as chinese, "en" as english) xxl.job.i18n= ### 7、管理界面的登錄用戶名密碼 xxl.job.login.username=admin xxl.job.login.password=123456
5、啟動項目
運行main函數,訪問 http://localhost:8081/xxl-job-admin/toLogin ,輸入用戶名密碼(在application.properties中配置的),登陸,到此為止,xxl-job項目部署成功。
二、項目中使用xxl-job
1、導入xxl-job依賴
<dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.0.2</version> </dependency>
2、配置文件中(application.yml)配置xxl-job配置
其中appname為項目名
xxl:
job:
accessToken:
executor:
appname: demo
ip:
logpath: /data/applogs/xxl-job/jobhandler
logretentiondays: -1
port: 9999
admin:
addresses: http://localhost:8081/xxl-job-admin
3、添加xxl-job配置類
直接復制,無需更改。
package com.example.demo.config; import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Slf4j @Configuration public class XXlJobConfig { @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() { log.info(">>>>>>>>>>> xxl-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; } }
4、定時任務控制器
(1)定時任務實現類
此處模擬一個最簡單的打印輸出
package com.example.demo.service; import org.springframework.stereotype.Service; @Service public class DemoJobService { public void demoTest(String s1){ System.out.println("==============" + s1); } }
(2)handler
此處注解非常重要。
package com.example.demo.handler; import com.example.demo.service.DemoJobService; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.IJobHandler; import com.xxl.job.core.handler.annotation.JobHandler; import com.xxl.job.core.log.XxlJobLogger; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @JobHandler(value = "demoHandler") @Component @Slf4j @RequiredArgsConstructor public class DemoHandler extends IJobHandler { private final DemoJobService demoJobService; @Override public ReturnT<String> execute(String s1) throws Exception { XxlJobLogger.log("xxl-job測試任務開始執行。【args: {}】", s1); try { demoJobService.demoTest(s1); XxlJobLogger.log("xxl-job測試任務執行結束。"); return SUCCESS; } catch (Exception e) { XxlJobLogger.log("xxl-job測試任務執行出錯!", e); return FAIL; } } }
至此,使用xxl-job的項目配置處理完畢。
三、定時任務執行配置
1、執行器配置
登陸xxl-job控制台后,點擊執行器管理------新增執行器。
執行器中內容:
AppName:在使用xxl-job項目中配置的appname(見第二步中的第2點)
名稱:隨便填寫(由於可能會多個項目同時使用xxl-job,因此建議一個項目一個執行器,且執行器名稱直接可以看出是哪個項目)
排序:1
注冊方式:自動注入
機器地址:空(xxl-job會自動掃描識別地址)
2、定時任務配置
任務管理---新增
任務中內容:
執行器:選擇指定的執行器
任務描述:定時任務的名稱
路由策略:可以根據自己的需要選擇(一般選擇輪詢)
FIRST(第一個):固定選擇第一個機器
LAST(最后一個):固定選擇最后一個機器
ROUND(輪詢):輪詢執行
RANDOM(隨機):隨機選擇在線的機器;
CONSISTENT_HASH(一致性HASH):每個任務按照Hash算法固定選擇某一台機器,且所有任務均勻散列在不同機器上。
LEAST_FREQUENTLY_USED(最不經常使用):使用頻率最低的機器優先被選舉;
LEAST_RECENTLY_USED(最近最久未使用):最久為使用的機器優先被選舉
FAILOVER(故障轉移):按照順序依次進行心跳檢測,第一個心跳檢測成功的機器選定為目標執行器並發起調度;
BUSYOVER(忙碌轉移):按照順序依次進行空閑檢測,第一個空閑檢測成功的機器選定為目標執行器並發起調度;
SHARDING_BROADCAST(分片廣播):廣播觸發對應集群中所有機器執行一次任務,同時系統自動傳遞分片參數;可根據分片參數開發分片任務;
Cron:定時任務執行時間(此處測試是每秒執行一次,所以配置的* * * * * ?)
運行模式:可根據自己需要選擇(一般選擇BEGAN)
BEAN模式:任務以JobHandler方式維護在執行器端;需要結合 "JobHandler" 屬性匹配執行器中任務;
GLUE模式(Java):任務以源碼方式維護在調度中心;該模式的任務實際上是一段繼承自IJobHandler的Java類代碼並 "groovy" 源碼方式維護,它在執行器項目中運行,可使用@Resource/@Autowire注入執行器里中的其他服務;
GLUE模式(Shell):任務以源碼方式維護在調度中心;該模式的任務實際上是一段 "shell" 腳本;
GLUE模式(Python):任務以源碼方式維護在調度中心;該模式的任務實際上是一段 "python" 腳本;
GLUE模式(PHP):任務以源碼方式維護在調度中心;該模式的任務實際上是一段 "php" 腳本;
GLUE模式(NodeJS):任務以源碼方式維護在調度中心;該模式的任務實際上是一段 "nodejs" 腳本;
GLUE模式(PowerShell):任務以源碼方式維護在調度中心;該模式的任務實際上是一段 "PowerShell" 腳本;
jobHandler:定時任務中@JobHandler注解中的配置
阻塞處理策略:根據自己需要選擇(一般選擇單機串行)
單機串行(默認):調度請求進入單機執行器后,調度請求進入FIFO隊列並以串行方式運行;
棄后續調度:調度請求進入單機執行器后,發現執行器存在運行的調度任務,本次請求將會被丟棄並標記為失敗;
覆蓋之前調度:調度請求進入單機執行器后,發現執行器存在運行的調度任務,將會終止運行中的調度任務並清空隊列,然后運行本地調度任務;
子任務ID:每個任務都擁有一個唯一的任務ID(任務ID可以從任務列表獲取),當本任務執行結束並且執行成功時,將會觸發子任務ID所對應的任務的一次主動調度。一般為空。
任務超時時間:支持自定義任務超時時間,任務運行超時將會主動中斷任務
失敗重試次數;支持自定義任務失敗重試次數,當任務失敗時將會按照預設的失敗重試次數主動進行重試;
報警郵件:任務調度失敗時郵件通知的郵箱地址,支持配置多郵箱地址,配置多個郵箱地址時用逗號分隔;
負責人:任務的負責人
執行參數:任務執行所需的參數,多個參數時用逗號分隔,任務執行時將會把多個參數轉換成數組傳入;
3、測試
點擊操作,執行一次,然后查看日志,看是否執行成功
此處顯示執行成功,然后可以在操作按鈕下正式啟動定時任務。
開啟定時任務后,可見后台在持續執行(按照配置的一秒輸出一次)
校驗失敗通知和重試次數:
在實現類中添加代碼:int k = 10/0;
查看執行日志,失敗了6次(原因是調度平台配置了失敗后重試5次)
在看調度平台中配置的異常警告郵件,也是有6次告警。這里可以將異常拋出,並在告警郵件中展示。
四、在docker上部署xxl-job
1、打包xxl-job-admin
2、在服務器中創建xxl-job文件夾: mkdir /usr/data/xxl-job
3、進入新創建的xxl-job文件夾,新建一個dockerfile文件,編輯文件
# Docker image for springboot file run # VERSION 0.0.1 # Author: eangulee # 基礎鏡像使用java FROM java:8 # 作者 MAINTAINER lcl <liconglong@163.com> # VOLUME 指定了臨時文件目錄為/tmp。 # 其效果是在主機 /var/lib/docker 目錄下創建了一個臨時文件,並鏈接到容器的/tmp VOLUME /tmp # 將jar包添加到容器中並更名為app.jar,此處的jar包名稱一定要與要部署的jar包名稱一致 ADD xxl-job-admin-2.1.1-SNAPSHOT.jar app.jar # 運行jar包 RUN bash -c 'touch /app.jar' ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
命令詳解:
FROM:基礎鏡像名稱
MAINTAINER:作者信息
VOLUME:數據掛載
ADD:項目的 jar 文件作為 “app.jar” 添加到容器的 ENTRYPOINT 執行項目 app.jar
ENTRYPOINT:指定容器啟動時需要執行的命令(為了縮短 Tomcat 啟動時間,添加一個系統屬性指向 “/dev/./urandom” 作為 Entropy Source 如果是第一次打包,它會自動下載java 8的鏡像作為基礎鏡像,以后再制作鏡像的時候就不會再下載了)
4、將xxl-job-admin.jar上傳至xxl-job文件夾
5、構建新的鏡像
docker build -t xxl-job-admin . (后面的.一定不要遺漏)
6、使用xxl-job-admin鏡像啟動新容器
docker run -d -p 8081:8081 xxl-job-admin
-d:后台運行
-p:端口映射
7、驗證
五、調整項目配置
更改第二步第2點中的xxl-job地址
六、按照第三步重新配置定時任務即可。