分佈式任務調度平臺xxl-job初使用

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的初步使用就分享這些了,具體的請看官方說明,很詳情
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章