第一步:下載xxl-job工程代碼:
https://gitee.com/dongfangxuri/springboot
下下來工程如下:
admin--->>后天管理,用於配置xxl-job各項數據
sample-springboot---->> 一個springboot集成xxl-job的demo 我們不用這個嗎,用自己的
core----------->> xxjob依賴的核心包,集成時候需要
簡單說:
集成xxl-job需要兩個節點:
1:admiin:后台管理
2:項目節點:用於集成xxljob
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
開始集成:
a:下下來項目找到:xxjob\xuxueli0323-xxl-job-master\xxl-job\doc\db
新建數據庫導入基表:
打開xxl-job-admin:
修改application.properties:
新增時區屬性,否則亂碼,然后啟動admin
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?Unicode=true&characterEncoding=UTF-8&serverTimezone=UTC
訪問:
http://localhost:8080/xxl-job-admin 賬戶/密碼:admin/123456
登錄后台:
看到該頁面即可
然后集成xxl-job:
自己項目引入xxl-job核心包:
<!--xxjob--> <!-- https://mvnrepository.com/artifact/com.githup.liuyanggithup/xxl-job-core --> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.2.0-SNAPSHOT</version> 我這里是最新的2.0 這個根據自己情況看 與剛才下下來的core項目版本需要一致 </dependency>
首先在springboot項目中新增如下配置:
### xxl-job admin address list, such as "http://address" or "http://address01,http://address02" 即剛才啟動的admin的地址 xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin ### xxl-job executor address 執行器的名稱 這個很重要 xxl.job.executor.appname=demo 與后台管理配置執行器名稱一致 xxl.job.executor.ip=127.0.0.1 xxl.job.executor.port=9999 如果是集群 不同的節點需要有不同的端口 比如 一個9999 一個9998 ### xxl-job, access token xxl.job.accessToken= ### xxl-job log path xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler ### xxl-job log retention days xxl.job.executor.logretentiondays=30
初始化xxl-job配置:
package com.example.demo.util; import com.xxl.job.core.executor.XxlJobExecutor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class XxlJobConfig { private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); @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 XxlJobExecutor xxlJobExecutor() { logger.info(">>>>>>>>>>> xxl-job config init."); System.out.println("初始化成功了。。。。。。。。。。"); 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; } }
定時任務:
package com.example.demo.schedule; import com.example.demo.util.MyUtil; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.IJobHandler; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class MyTask1 extends IJobHandler { @Override public ReturnT<String> execute(String s) throws Exception { System.out.println("this is " + MyUtil.port + " MyTask1"); testHelloWord(); return ReturnT.SUCCESS; } public void testHelloWord() { System.out.println("hello word " + MyUtil.port + " MyTask1"); } }
啟動項目無報錯,集成完畢。
配置后台管理:
1:新增執行器:
appName要與配置文件配置的xxl.job.executor.appname一模一樣 不然找不到(重點):
自動注冊會發現注冊到admin的ip,我這里是集群兩個節點,所以是兩個(xxl.job.executor.port 需不同 )
保存
進入任務管理:
新增任務:
執行器即是剛才新建的執行器,選擇一個即可,
這里有兩個重點:
1:路由策略:第一個即集群環境下選擇第一個節點執行,我們這里選擇輪詢,這次a,下次b
2:運行模式:我們選擇GLUE(JAVA):即繼承:
IJobHandler的這種實現方式:
package com.example.demo.schedule; import com.example.demo.util.MyUtil; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.IJobHandler; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class MyTask1 extends IJobHandler { @Override public ReturnT<String> execute(String s) throws Exception { System.out.println("this is " + MyUtil.port + " MyTask1"); testHelloWord(); return ReturnT.SUCCESS; } public void testHelloWord() { System.out.println("hello word " + MyUtil.port + " MyTask1"); } }
最后,需包這段代碼復制到:(重點)
進入:
原則上,這里代碼與程序代碼一模一樣,否則執行會有差異,根據情況去定奪
這樣,我們即完成了springboot繼承xxl-job的任務
但是一般開發中不可能是單任務單節點,所以,我們看下多任務,集群部署的配置,大同小異:
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我這里是兩個定時任務:
所以需要在admin配置兩個:
看我們執行器是一個地址列表:
所以會根據路由模式,去輪詢
輪詢結果:
間隔2秒依次執行
在調度日志查看調度情況:
我這里配置如下: