xxl-job對比ElasticJob使用示例詳解
1. xxl-job
松哥也在微信群裡和小夥伴們討論過各自到底用的是 xxl-job 還是 ElasticJob,討論的結果就是,xxl-job 使用的人更多一些。
不說功能的優劣,我們單純從數據上其實就能看出一些端倪:
這是 xxl-job 的 GitHub:
這是 ElasticJob 的 GitHub:
從這個數據比較上大概也能看出來 xxl-job 更火一些。註意我這裡說的是更火一些,不是說 xxl-job 比 ElasticJob 更強。
xxl-job 出自大眾點評,這是一個分佈式輕量級的任務調度框架,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。
xxl-job 通過一個中心式的調度平臺,調度多個執行器執行任務,調度中心通過 DB 鎖保證集群分佈式調度的一致性,這樣擴展執行器會增大 DB 的壓力,然而大部分公司的任務數,執行器並不多;xxl-job 提供瞭非常好用的監控頁面甚至還有任務失敗的郵件告警功能。不同於 ElasticJob,xxl-job 在使用時依賴 MySQL,而不需要 ZooKeeper。
ElasticJob 則出自當當,設計 ElasticJob 的初衷是為瞭面對高並發以及復雜的業務,即使是在業務量大,服務器多的時候也能做好任務調度,盡可能的利用服務器的資源。ElasticJob 是無中心化的,如果主服務器掛瞭,會自動通過 ZooKeeper 的選舉機制選舉出新的主服務器。因此 ElasticJob 具有良好的擴展性和可用性。
所以,你打算用哪個?
2. 運行 xxl-job
我們先把 xxl-job 跑起來,再寫我們自己的代碼。
首先我們先把 xxl-job 的代碼搞下來,地址:
https://github.com/xuxueli/xxl-job
然後用 IDEA 打開項目,打開之後,有四個主要的文件夾:
doc:項目文檔xxl-job-admin:任務調度平臺xxl-job-core:核心代碼xxl-job-executor-samples:案例
由於 xxl-job 運行需要數據庫,所以接下來我們就來配置數據庫,先找到數據庫腳本,在 doc/db/tables_xxl_job.sql
位置。
找到數據庫腳本後,導入到數據庫中執行一下,執行完成後,生成如下庫和表:
接下來找到 xxl-job-admin/src/main/resources/application.properties
文件,修改數據庫連接信息:
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=123 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
日志配置也要修改一下,在 xxl-job-admin/src/main/resources/logback.xml
文件中,有如下一行:
<property name="log.path" value="/data/applogs/xxl-job/xxl-job-admin.log"/>
如果你是 Windows 操作系統,這裡肯定要改,如果你是 Mac 的話,也有可能沒有這個目錄的權限,因此我建議大傢改一下這裡的配置,改為如下這樣:
<property name="log.path" value="./applogs/xxl-job/xxl-job-admin.log"/>
改為在項目運行目錄下生成這個日志文件。
修改完成後,接下來我們就可以啟動 xxl-job-admin 項目瞭,這是一個 SpringBoot 項目,找到啟動類,直接運行其 main 方法即可。
項目啟動成功後,瀏覽器輸入如下地址 http://localhost:8080/xxl-job-admin/toLogin
,就可以看到登錄頁面瞭:
默認的登錄賬號是 admin/123456
。
看到如下頁面,就是登錄成功瞭。
3. 開發定時任務
3.1 項目創建及配置
接下來我們來創建一個項目,跑一個定時任務看看。
首先創建一個 SpringBoot 項目,引入 Web 依賴,如下:
項目創建成功後,引入 xxl-job 的依賴:
<dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.3.0</version> </dependency>
然後在 resources 目錄下加入 logback.xml,內容如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false" scan="true" scanPeriod="1 seconds"> <contextName>logback</contextName> <property name="log.path" value="./applogs/xxl-job/xxl-job-executor-sample-springboot.log"/> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern> </rollingPolicy> <encoder> <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n </pattern> </encoder> </appender> <root level="info"> <appender-ref ref="console"/> <appender-ref ref="file"/> </root> </configuration>
修改 application.properties 文件,內容如下:
# web port server.port=8089 # 日志配置 logging.config=classpath:logback.xml # 配置調度中心地址 xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin # 執行器和調度中心之間的通信令牌,如果沒有配置,表示關閉瞭通信令牌的校驗。 # 在 xxl-job-admin 的配置文件中,有一個一模一樣的配置項,兩邊都配置,就會進行校驗。 xxl.job.accessToken= # 配置執行器的名字 xxl.job.executor.appname=xxl-job-demo # 執行器地址,如果沒有配置,就使用 IP:PORT 作為默認值 xxl.job.executor.address= # 執行器 ip 地址 xxl.job.executor.ip= # 執行器端口,默認即 9999 xxl.job.executor.port=9999 # 執行器日志文件位置 xxl.job.executor.logpath=./applogs/xxl-job/jobhandler # 執行器日志保存時間 xxl.job.executor.logretentiondays=30
各項配置的含義我已經加瞭註釋瞭。
接下來再提供一個配置類,如下:
@Configuration public class XxlJobConfig { private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); @Value("${xxl.job.admin.addresses}") private String adminAddresses; @Value("${xxl.job.accessToken}") private String accessToken; @Value("${xxl.job.executor.appname}") private String appname; @Value("${xxl.job.executor.address}") private String address; @Value("${xxl.job.executor.ip}") private String ip; @Value("${xxl.job.executor.port}") private int port; @Value("${xxl.job.executor.logpath}") private String logPath; @Value("${xxl.job.executor.logretentiondays}") private int logRetentionDays; @Bean public XxlJobSpringExecutor xxlJobExecutor() { logger.info(">>>>>>>>>>> xxl-job config init."); XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); xxlJobSpringExecutor.setAdminAddresses(adminAddresses); xxlJobSpringExecutor.setAppname(appname); xxlJobSpringExecutor.setAddress(address); xxlJobSpringExecutor.setIp(ip); xxlJobSpringExecutor.setPort(port); xxlJobSpringExecutor.setAccessToken(accessToken); xxlJobSpringExecutor.setLogPath(logPath); xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); return xxlJobSpringExecutor; } }
其實就是把剛剛 application.properties 中的屬性都配置成一個 XxlJobSpringExecutor Bean,很奇怪官方為什麼沒把這個搞成一個自動化配置的 Bean。
接下來我們就可以創建一個具體的定時任務瞭。
3.2 定時任務開發方式
對於我們 Java 工程師而言,有三種開發定時任務的方式。
3.2.1 BEAN 模式(類形式)
Bean 模式任務,支持基於類的開發方式,每個任務對應一個 Java 類。
優點:不限制項目環境,兼容性好。即使是無框架項目,如 main 方法直接啟動的項目也可以提供支持。
缺點:
- 每個任務需要占用一個Java類,造成類的浪費;
- 不支持自動掃描任務並註入到執行器容器,需要手動註入。
開發方式:
1.開發一個繼承自 com.xxl.job.core.handler.IJobHandler
的 JobHandler 類,實現其中任務方法。
2.手動通過如下方式註入到執行器容器:
XxlJobExecutor.registJobHandler("demoJobHandler", new DemoJobHandler());
3.在調度中心新建調度任務(後續步驟和 3.2.1 BEAN 模式(方法形式)
一致)。
這種方式用的不多,我就不給大傢演示瞭,小夥伴們可以自行嘗試。
3.2.2 BEAN模式(方法形式)
Bean 模式任務,支持基於方法的開發方式,每個任務對應一個方法,一般推薦這種方式。
優點:
- 每個任務隻需要開發一個方法,並添加 ”@XxlJob” 註解即可,更加方便、快速。
- 支持自動掃描任務並註入到執行器容器。
缺點:
要求 Spring 容器環境。
基於方法開發的任務,底層會生成 JobHandler 代理,和基於類的方式一樣,任務也會以 JobHandler 的形式存在於執行器任務容器中。
開發步驟:
1.開發 Job 方法:
@Component public class MyJob { @XxlJob("demoJobHandler") public ReturnT<String> demoJobHandler() throws Exception { String param = XxlJobHelper.getJobParam(); XxlJobHelper.log("XXL-JOB, Hello World:{}",param); return ReturnT.SUCCESS; } }
這裡的 @XxlJob
註解標記瞭這是一個定時任務方法,該註解還有 init 和 destroy 屬性,可以分別用來配置初始化和銷毀的方法。
XxlJobHelper.getJobParam()
可以用來獲取任務參數。
在這個過程中,我們需要通過 XxlJobHelper.log
打印執行日志。
默認任務結果為 “成功” 狀態,不需要主動設置;如有訴求,比如設置任務結果為失敗,可以通過 XxlJobHelper.handleFail/handleSuccess
自主設置任務結果。
然後啟動 SpringBoot 項目。
2.配置調度中心,新建調度任務
接下來打開配置調度中心,找到執行器管理,點擊新增,如下:
如果是自動註冊的話,可以不用填機器地址。
接下來找到任務管理,並點擊新增:
基礎配置都沒啥好說的。
調度類型選擇 CRON 表達式,CRON 表達式可以自己填,也可以點擊後面的編輯按鈕自動生成。
運行模式就選擇 BEAN,JobHandler 的值就是我們前面 @XxlJob 註解中填的值,任務參數就是定時任務的方法參數。
配置完成後,回到執行器管理,點擊查看,可以查看剛剛註冊的節點信息:
再次回到任務管理,選擇啟動,就可以開始定時任務的執行瞭:
開啟之後,點擊調度日志,就可以看到我們系統任務執行的詳細信息瞭:
可以看到,每隔 5 秒執行一次。
點擊調度備註,可以查看一些調度細節:
在右邊操作按鈕中選擇執行日志:
可以查看執行細節:
紅色框出來的,就是我們剛剛自己打印的。
當然這裡還有一些其他玩法,小夥伴們可以自行點擊按鈕嘗試,我就不贅述瞭。
3.2.3 GLUE 模式(Java)
任務以源碼方式維護在調度中心,支持通過 Web IDE 在線更新,實時編譯和生效,因此不需要指定 JobHandler。即在網頁上寫定時任務的代碼,然後去執行。
這種方式個人感覺使用較少,小夥伴們瞭解一下即可。
開發流程如下:
調度中心->任務管理,新建調度任務,新建時選擇 “GLUE模式(Java)”:
2.開發任務代碼:選中指定任務,點擊該任務右側 GLUE 按鈕,將會前往 GLUE 任務的 Web IDE 界面,在該界面支持對任務代碼進行開發(也可以在IDE中開發完成後,復制粘貼到編輯中)。
編輯完成後,保存即可。接下來又和前面一樣瞭,啟動任務,後查看調度日志。
這裡支持 30 個版本的版本回溯,在 GLUE 任務的 Web IDE 界面,選擇右上角下拉框“版本回溯”,會列出該 GLUE 的更新歷史,選擇相應版本即可顯示該版本代碼,保存後 GLUE 代碼即回退到對應的歷史版本。
4. 小結
好啦,這就是我跟大傢介紹的 xxl-job,感興趣的小夥伴可以試試哦~
本文案例 https://github.com/lenve/javaboy-code-samples/tree/master/xxl-job-demo
以上就是xxl-job對比ElasticJob使用示例詳解的詳細內容,更多關於xxl-job對比ElasticJob的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- SpringBoot整合Xxl-job實現定時任務的全過程
- 分佈式任務調度xxl-job問題解決
- springboot整合xxl-job的示例代碼
- SpringBoot項目集成xxljob實現全紀錄
- xxl-job如何濫用netty導致的問題及解決方案