【xxl-job】輕鬆實現分散式定時任務demo例項
【專案描述】
前段時間專門獨立了一個spring boot服務,用於做和第三方erp系統的對接工作。此服務的第一個需求工作就是可以通過不同的規則,設定不同的定時任務,從而獲取erp系統的商品資料。所以,系統架構採用了xxl-job實現分散式定時任務。
【學習背景】
此專案不是我負責的,在上個月同事讓我幫忙處理一個問題,便帶給了我學習的機會,這個框架已經在線上環境使用,但框架也不是我參與搭建的,所以還是找到官方文件和專案例項,積累下技術與專案經驗。本篇部落格是一個簡單的demo例項,主要總結下如何將此框架與我們的專案結合。
【例項搭建】
初始化“排程資料庫”
下載專案原始碼,獲取“排程資料庫初始化SQL指令碼”,正常情況下生成16張表。
sql指令碼位置: /xxl-job/doc/db/tables_xxl_job.sql
專案原始碼地址:https://github.com/xuxueli/xxl-job
在IDEA中,我們可以直接選擇通過github地址新建專案:
配置部署“排程中心"
排程中心配置檔案地址:
/xxl-job/xxl-job-admin/src/main/resources/xxl-job-admin.properties
我們只需要將資料庫連線配置修改成自己的環境:
部署專案
正確進行上述配置後,我們可將專案編譯打war包部署到tomcat中。排程中心訪問地址:http://localhost:8080/xxl-job-admin (預設8080埠,該地址執行器將會使用到,作為回撥地址)
我使用的是IDEA中Smart Tomcat部署的專案:
部署成功的話,你可以看到如下介面:
使用管理系統,在“任務管理"中,新建一個定時任務,填寫好相關的配置資訊
使用管理系統,在“執行器管理”中配置一個執行器,也就是我們的專案中需要用到的
至此,排程中心的部署和配置工作結束了。下面是將此配置與我們的專案結合。只是一個demo例項,我就新建了一個spring boot框架專案,加入xxl-job框架搭建步驟如下:
1.專案加入maven依賴
<!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ --> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>1.9.1</version> </dependency>
2.xxlJobConfig配置類
@Slf4j @Configuration //掃描定時任務設定包路徑 @ComponentScan(basePackages = "com.uqiauto.springbootxxljob.job") public class XxlJobConfig { @Value("${xxl.job.admin.address}") private String adminAddresses; @Value("${xxl.job.executor.appname}") private String appName; @Value("${xxl.job.alarmEmail}") private String alarmEmail; @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 XxlJobExecutor xxlJobExecutor() { log.info(">>>>>>>>>>> xxl-job config init."); XxlJobExecutor xxlJobExecutor = new XxlJobExecutor(); xxlJobExecutor.setAdminAddresses(adminAddresses); xxlJobExecutor.setAppName(appName); xxlJobExecutor.setIp(ip); xxlJobExecutor.setPort(port); xxlJobExecutor.setAccessToken(accessToken); xxlJobExecutor.setLogPath(logPath); xxlJobExecutor.setLogRetentionDays(logRetentionDays); return xxlJobExecutor; } public String getAdminAddresses() { return adminAddresses; } public String getAppName() { return appName; } public String getIp() { return ip; } public int getPort() { return port; } public String getAccessToken() { return accessToken; } public String getLogPath() { return logPath; } public int getLogRetentionDays() { return logRetentionDays; } public String getAlarmEmail() { return alarmEmail; } }
3.定時任務設定demo job
/** * 任務Handler示例(Bean模式) * * 開發步驟: * 1、繼承"IJobHandler":“com.xxl.job.core.handler.IJobHandler”; * 2、註冊到Spring容器:新增“@Component”註解,被Spring容器掃描為Bean例項; * 3、註冊到執行器工廠:新增“@JobHandler(value="自定義jobhandler名稱")”註解,註解value值對應的是排程中心新建任務的JobHandler屬性的值。 * 4、執行日誌:需要通過 "XxlJobLogger.log" 列印執行日誌; * * @author xuxueli 2015-12-19 19:43:36 */ @JobHandler(value="demoJobHandler") @Component public class DemoJobHandler 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("beat at:" + i); TimeUnit.SECONDS.sleep(2); } return SUCCESS; } }
4.專案中配置xxl-job框架需要用到的資訊
xxl.job: admin.address: http://localhost:8088/xxl-job-admin/ accessToken: alarmEmail: [email protected] executor: appname: xxl-job-executor-sample ip: port: 9999 logpath: /data/applogs/xxl-job/jobhandler #執行器Log檔案定期清理功能,指定日誌儲存天數,日誌檔案過期自動刪除。限制至少保持3天,否則功能不生效; logretentiondays: -1
至此,整個搭建步驟就完成了。我設定的定時任務是每小時執行一次,同時也支援我們在管理系統頁面去手動執行,最終我們可以通過管理系統去檢視到定時任務執行的相關日誌資訊:
每條日誌的詳細資訊:
【學習總結】
本篇部落格只是一個簡單的教程,將xxl-job分散式定時任務框架結合到一個spring boot 專案中,後面還會深入學習此分散式定時任務框架的其他知識,將此分散式定時任務框架與其他框架進行對比學習。