日常開發中難免會碰到需要開啟定時任務處理業務。這時我們第一時間想到的是Spring的Task,但是很不方便,這里可以列出幾點:
1.一旦需要更改定時任務時間,我們就要打開IDE修改cron表達式;
2.在特殊的情況下代碼報錯了,我們就要打開Log查看是什么導致的問題;
3.需要很多定時任務去處理業務就要新建多個,突然不想執行這個任務了,我們就要再打開IDE注釋那些代碼。
就特別不好管理。
可能又有人要說了:
1.我可以用Redis進行動態修改cron表達式;-------- 看下面代碼!!!
2.我寫個Aop,只要出現異常了我就記錄相關信息;-------- 牛掰!Aop固然好,但是你覺得真的方便了嗎?
3.······我就是不閑麻煩,咋地。-------- 打擾了!!!
package cn.chenghao.config; import lombok.AllArgsConstructor; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; import org.springframework.scheduling.support.CronTrigger; import javax.annotation.PostConstruct; /** * 自定義定時任務 * * @Author chenghao * @Date 2020/4/14 11:56 **/ @Configuration @EnableScheduling @AllArgsConstructor public class CompleteScheduleConfig implements SchedulingConfigurer { /** * StringRedis模板 */ private final StringRedisTemplate stringRedisTemplate; /** * 初始化 */ @PostConstruct private void init() { // redis中不存在則創建 stringRedisTemplate.opsForValue().setIfAbsent("cron", "0/3 * * * * ?"); } /** * 配置任務 */ @Override public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { // 給定cron表達式,觸發Runnable任務 scheduledTaskRegistrar.addTriggerTask( () -> { System.out.println("執行定時任務中......."); }, triggerContext -> { // 獲取cron表達式 String cron = stringRedisTemplate.opsForValue().get("cron"); // 返回執行周期 return new CronTrigger(cron).nextExecutionTime(triggerContext); }); } }
!(真的是太方便了)
----------------------------------好,廢話不再多說----------------------------------
XXL-JOB地址:
Gitee:https://gitee.com/xuxueli0323/xxl-job
GitHub:https://github.com/xuxueli/xxl-job/
XXL社區:https://www.xuxueli.com/xxl-job/
概述:XXL-JOB是一個分布式任務調度平台,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。現已開放源代碼並接入多家公司線上產品線,開箱即用。
首先將項目clone下來后,再打開社區文檔,根據文檔引導先將 doc/db/tables_xxl_job.sql 腳本在自己的數據庫中執行
確認無誤后,再繼續看文檔:
XXL-JOB分為三個大模塊:調度中心、公共依賴、執行器
首先我們根據文檔引導,配置調度中心
/xxl-job/xxl-job-admin/src/main/resources/application.properties
想想還是截個圖:
相應配置完成后,直接運行admin模塊,瀏覽器輸入:http://localhost:8080/xxl-job-admin 默認登錄賬號 admin/123456
剛進去這首頁我還是很吃驚的!!!
調度器配置、運行都成功了現在我們就要新建個任務看看效果了,在這之前我們還要配置執行器,也就是執行任務的容器
/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties
想來想去我又截了:
配置好對應調度中心的信息后,我們在運行執行器
運行沒問題后,我們來新建個任務試試水:
我們就先用GLUE模式試試吧
保存完后,直接點擊啟動!!!
看控制台:
看日志:
任何操作一目了然!!!
現在我們知道了XXL-JOB的作用了,就在想怎么對接到自己的項目運行,其實想想就是將公共依賴模塊移出來
<!-- xxl-job 任務調度 --> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.2.0</version> </dependency>
隨后根據clone下來項目中的springboot版本的執行器復制 application.properties
package cn.running.taskdispatchdemo.config; import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; import lombok.extern.java.Log; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; /** * 執行器配置 * * @author chenghao * @createTime 2020/5/21 */ @Log @Configuration @ComponentScan(basePackages = "cn.running.taskdispatchdemo.handler") 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") public XxlJobSpringExecutor xxlJobSpringExecutor() { log.info("》》》》》 XXL-JOB 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 需要我們去新建
package cn.running.taskdispatchdemo.handler; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.annotation.XxlJob; import org.springframework.stereotype.Component; import java.time.LocalDateTime; /** * 任務處理 * * @author chenghao * @createTime 2020/5/21 */ @Component("myHandler") public class MyHandler { @XxlJob("demoJobHandler") public ReturnT<String> execute(String s) { System.out.println("任務執行成功,執行參數:" + s + "當前時間是:" + LocalDateTime.now()); return ReturnT.SUCCESS; } }
這樣就ok了,重啟執行器就行了。再啟動任務
看控制台:
看日志:
至此,我們再來看看首頁的樣子