1.因爲在服務中寫定時任務,當服務發佈多份實例時,會多次執行,可能造業務數據混亂,把定時任務執行次數分離出來,由分佈式任務調度平臺去控制
2.本篇將介紹 xxl-job
3.概要說明,xxl-job的工作原理
- 1.部署xxl-job服務端,由該服務端控制業務服務裏面的定時任務執行次數和時間
- 2.在業務服務中引入xxl-job客戶端依賴,指定xxl-job服務端的地址,相當於向服務端註冊本服務的IP+PORT,這樣xxl-job服務端才能調用業務服務裏面的定時任務
- 3.在xxl-job服務端提供的Web管理後臺控制任務執行時間
以上是我對xxl-job的理解,具體請參考官網文檔
4.部署xxl-job服務端,將採用docker部署
xxl-job需要mysql數據庫存儲任務配置信息,因此需要先把數據庫和表數據初始化好,官網提供了腳步
https://github.com/xuxueli/xxl-job/blob/master/doc/db/tables_xxl_job.sql
#配置好mysql地址和賬戶信息,把日誌信息映射到宿主機
docker run -it -d -e PARAMS="--spring.datasource.url=jdbc:mysql://localhost:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai --spring.datasource.username=root --spring.datasource.password=123456" \
-v /root/xxl-job/data/applogs:/data/applogs \
--name xxl-job-admin \
-p 8080:8080 \
--network=host xuxueli/xxl-job-admin:2.2.0
啓動好後訪問: localhost:8080/xxl-job-admin/ (要帶 /xxl-job-admin 路徑),默認 admin 123456
5.客戶端業務服務SpringBoot,寫定時任務
- 1.引入xxl-job-core
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.2.0</version>
</dependency>
- 2.application.yml配置 xxl-job 服務端信息
xxl:
job:
accessToken:
admin:
addresses: http://192.168.6.1:8080/xxl-job-admin
executor:
appname: mobile-job
ip:
port: 9997
logpath: /data/applogs/xxl-job/jobhandler
logretentiondays: -1
address:
- 3.配置xxl-job bean
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.commons.util.InetUtils;
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.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;
@Autowired
private InetUtils inetUtils;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
String ipAddress = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
logger.info(">>>>>>>>>>> xxl-job config init.");
logger.info(">>>>>>>>>>>appname:{}", appname);
logger.info(">>>>>>>>>>>adminAddresses:{}", adminAddresses);
logger.info(">>>>>>>>>>>address:{}", address);
logger.info(">>>>>>>>>>>ip:{}", ipAddress);
logger.info(">>>>>>>>>>>port:{}", port);
logger.info(">>>>>>>>>>>logRetentionDays:{}", logRetentionDays);
logger.info(">>>>>>>>>>>logPath:{}", logPath);
logger.info(">>>>>>>>>>>accessToken:{}", accessToken);
inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setAddress(address);
xxlJobSpringExecutor.setIp(ipAddress);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
- 4.寫定時任務業務代碼
@Component
public class MobileJobhandler {
//統計任務服務
@Autowired
private StatisticTask statisticTask;
/**
* 統計定時任務 在xxl-job中設置該任務凌晨5:30點執行
* 使用XxlJob註解,裏面的value=mobileTasks
* 在xxl-job web後臺的任務管理的 JobHandler中對應填寫 mobileTasks ,通過xxl-job執行時,就會調用該業務服務
* @return
*/
@XxlJob("mobileTasks")
public ReturnT<String> scheduledTasks(String param) {
//業務統計服務代碼,就不列出來了
statisticTask.scheduledTasks();
return ReturnT.SUCCESS;
}
}
- 5.分佈式任務調度平臺調度業務服務中的任務,在xxl-job後臺新增任務,裏面定義好cron執行時間,該任務執行那個 JobHandler ,JobHandler="mobileTasks"與代碼中@XxlJob(“mobileTasks”)對應
- 6.啓動定時任務,狀態就位RUNNING了,還可以查詢任務日誌
xxl-job的初步使用就分享這些了,具體的請看官方說明,很詳情