XXL-Job學(xué)習(xí)筆記(一)

1 概述

XXL-JOB是一個(gè)輕量級(jí)分布式任務(wù)調(diào)度平臺(tái)索昂,其核心設(shè)計(jì)目標(biāo)是開發(fā)迅速怔毛、學(xué)習(xí)簡單左痢、輕量級(jí)、易擴(kuò)展瞒大。

1.1 下載

源碼倉庫地址

源碼倉庫地址
https://github.com/xuxueli/xxl-job
http://gitee.com/xuxueli0323/xxl-job

maven依賴

        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>1.9.2</version>
        </dependency>

1.2 環(huán)境

  • JDK:1.7+
  • Servlet/JSP Spec:3.1/2.3
  • Tomcat:8.5.x/Jetty9.2.x
  • Spring-boot:1.5.x/Spring4.x
  • Mysql:5.6+
  • Maven:3+

2 使用

2.1 安裝

下載XXL-Job 源碼
https://github.com/xuxueli/xxl-job 克隆項(xiàng)目至本地

初始化數(shù)據(jù)庫

初始化項(xiàng)目數(shù)據(jù)庫至本地?cái)?shù)據(jù)庫螃征,SQL腳本位置如下:

/xxl-job/doc/db/tables_xxl_job.sql

部署調(diào)度中心

打開下載的源碼編譯,配置調(diào)度中心

調(diào)度中心配置文件地址:

/xxl-job/xxl-job-admin/src/main/resources/xxl-job-admin.properties

配置信息詳解:

### 調(diào)度中心JDBC鏈接:鏈接地址請(qǐng)保持和 2.1章節(jié) 所創(chuàng)建的調(diào)度數(shù)據(jù)庫的地址一致
xxl.job.db.driverClass=com.mysql.jdbc.Driver
xxl.job.db.url=jdbc:mysql://localhost:3306/xxl-job?useUnicode=true&characterEncoding=UTF-8
xxl.job.db.user=root
xxl.job.db.password=root_pwd

### 報(bào)警郵箱
xxl.job.mail.host=smtp.163.com
xxl.job.mail.port=25
xxl.job.mail.ssl=false
xxl.job.mail.username=ovono802302@163.com
xxl.job.mail.password=asdfzxcv
xxl.job.mail.sendFrom=ovono802302@163.com
xxl.job.mail.sendNick=《任務(wù)調(diào)度平臺(tái)XXL-JOB》

### 登錄賬號(hào)
xxl.job.login.username=admin
xxl.job.login.password=123456

### 調(diào)度中心通訊TOKEN透敌,非空時(shí)啟用
xxl.job.accessToken=

### 調(diào)度中心國際化設(shè)置盯滚,默認(rèn)為中文版本,值設(shè)置為“en”時(shí)切換為英文版本
xxl.job.i18n=

運(yùn)行項(xiàng)目

運(yùn)行源碼中的xxl-job-admin項(xiàng)目酗电,通過tomcat啟動(dòng)

2.2 編寫分布式執(zhí)行器

創(chuàng)建執(zhí)行器項(xiàng)目

創(chuàng)建SpringBoot項(xiàng)目魄藕,引入了 "xxl-job-core" 的maven依賴;配置項(xiàng)目POM如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>xxl-job-taoran</groupId>
    <artifactId>xxl-job</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-boot.version>1.5.16.RELEASE</spring-boot.version>
        <elasticsearch.version>5.5.2</elasticsearch.version>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.16.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>


    <dependencies>

        <dependency>
            <groupId>com.sun.jna</groupId>
            <artifactId>jna</artifactId>
            <version>3.0.9</version>
        </dependency>

        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>1.9.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--hystrix_End-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <!--<scope>provided</scope>-->
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.45</version>
        </dependency>

        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.2</version>
        </dependency>

    </dependencies>


    <build>
        <plugins>
            <!-- spring-boot-maven-plugin (提供了直接運(yùn)行項(xiàng)目的插件:如果是通過parent方式繼承spring-boot-starter-parent則不用此插件) -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

配置執(zhí)行器

執(zhí)行器配置文件:

/src/main/resources/xxl-job-executor.properties

配置參數(shù)詳解:

### xxl-job admin address list:調(diào)度中心部署跟地址:如調(diào)度中心集群部署存在多個(gè)地址則用逗號(hào)分隔撵术。執(zhí)行器將會(huì)使用該地址進(jìn)行"執(zhí)行器心跳注冊(cè)"和"任務(wù)結(jié)果回調(diào)"背率。
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin

### xxl-job executor address:執(zhí)行器"AppName"和地址信息配置:AppName執(zhí)行器心跳注冊(cè)分組依據(jù);地址信息用于"調(diào)度中心請(qǐng)求并觸發(fā)任務(wù)"和"執(zhí)行器注冊(cè)"嫩与。執(zhí)行器默認(rèn)端口為9999寝姿,執(zhí)行器IP默認(rèn)為空表示自動(dòng)獲取IP,多網(wǎng)卡時(shí)可手動(dòng)設(shè)置指定IP划滋,該IP不會(huì)綁定Host僅作為通訊實(shí)用会油。單機(jī)部署多個(gè)執(zhí)行器時(shí),注意要配置不同執(zhí)行器端口古毛;
xxl.job.executor.appname=xxl-job-executor-sample
xxl.job.executor.ip=
xxl.job.executor.port=9999

### xxl-job, access token:執(zhí)行器通訊TOKEN,非空時(shí)啟用
xxl.job.accessToken=

### xxl-job log path:執(zhí)行器運(yùn)行日志文件存儲(chǔ)的磁盤位置,需要對(duì)該路徑擁有讀寫權(quán)限
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/

### xxl-job log retention days:執(zhí)行器Log文件定期清理功能稻薇,指定日志保存天數(shù)嫂冻,日志文件過期自動(dòng)刪除。限制至少保持3天塞椎,否則功能不生效桨仿;
xxl.job.executor.logretentiondays=-1

SpringBoot 集成

引入配置文件,或者將配置參數(shù)直接配置在application.properties文件中

@PropertySource(
        value = {"classpath:xxl-job-executor.properties"})

配置JAVA Config,代碼如下

package com.taoran.xxl.config;

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;

/**
 * xxl-job config
 *
 * @author xuxueli 2017-04-28
 */
//@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.");
        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;
    }

}

創(chuàng)建Demo Handler

創(chuàng)建演示Demo

@JobHandler(value="demoJobHandler")
@Component
public class DemoJobHandler extends IJobHandler {

    @Override
    public ReturnT<String> execute(String param) throws Exception {
        XxlJobLogger.log("XXL-JOB, Hello World.");

        for (int i = 0; i < 5; i++) {
            XxlJobLogger.log("beat at:" + i);
            TimeUnit.SECONDS.sleep(2);
        }
        return SUCCESS;
    }

}

啟動(dòng)SpringBoot

@SpringBootApplication
@ComponentScan(basePackages = "com.taoran")
//@PropertySource(
//        value = {"classpath:xxl-job-executor.properties"})
//@EnableElasticsearchRepositories(basePackages = "com.taoran.es.repo")
public class AppLoader {
    public static void main(String[] args) {
        SpringApplication.run(AppLoader.class);
    }
}

調(diào)度中心

啟動(dòng)執(zhí)行器

XXL-Job將會(huì)自動(dòng)將我們的Handler注冊(cè)進(jìn)調(diào)度中心案狠,我們?cè)谌蝿?wù)調(diào)度列表中可以進(jìn)行任務(wù)調(diào)度處理服傍,如圖


image

該死的有道會(huì)員

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市骂铁,隨后出現(xiàn)的幾起案子吹零,更是在濱河造成了極大的恐慌,老刑警劉巖拉庵,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灿椅,死亡現(xiàn)場離奇詭異,居然都是意外死亡钞支,警方通過查閱死者的電腦和手機(jī)茫蛹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烁挟,“玉大人婴洼,你說我怎么就攤上這事『成ぃ” “怎么了柬采?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長静稻。 經(jīng)常有香客問我警没,道長,這世上最難降的妖魔是什么振湾? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任杀迹,我火速辦了婚禮,結(jié)果婚禮上押搪,老公的妹妹穿的比我還像新娘树酪。我一直安慰自己,他們只是感情好大州,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布续语。 她就那樣靜靜地躺著,像睡著了一般厦画。 火紅的嫁衣襯著肌膚如雪疮茄。 梳的紋絲不亂的頭發(fā)上滥朱,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音力试,去河邊找鬼徙邻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛畸裳,可吹牛的內(nèi)容都是我干的缰犁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼怖糊,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼帅容!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起伍伤,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤并徘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后嚷缭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饮亏,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年阅爽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了路幸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡付翁,死狀恐怖简肴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情百侧,我是刑警寧澤砰识,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站佣渴,受9級(jí)特大地震影響辫狼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辛润,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一膨处、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧砂竖,春花似錦真椿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至置济,卻和暖如春解恰,著一層夾襖步出監(jiān)牢的瞬間锋八,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國打工修噪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留查库,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓黄琼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親整慎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脏款,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)裤园,斷路器撤师,智...
    卡卡羅2017閱讀 134,701評(píng)論 18 139
  • 1.簡介 1.1概述 XXL-JOB是一個(gè)輕量級(jí)分布式任務(wù)調(diào)度框架,其核心設(shè)計(jì)目標(biāo)是開發(fā)迅速拧揽、學(xué)習(xí)簡單剃盾、輕量級(jí)、易...
    會(huì)飛的譚豬豬閱讀 8,806評(píng)論 1 8
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,852評(píng)論 6 342
  • 出門在外的游子呵淤袜,總被故鄉(xiāng)的線牽著痒谴。 不論多遠(yuǎn),這些線總?cè)綦[若現(xiàn)铡羡。 當(dāng)你回來积蔚,這些線就清晰可見。 它們烦周,千絲萬縷尽爆,...
    深空之藍(lán)閱讀 203評(píng)論 0 0
  • 第十一章和第十二章讀書筆記 因?yàn)閷殞氝€小,現(xiàn)在還沒涉及到批評(píng)錯(cuò)誤读慎。但是讓我想起了自己小時(shí)候的一些事漱贱。小的時(shí)候總是摔...
    芳芳的讀書時(shí)光閱讀 107評(píng)論 0 0