最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

xxl-job的部署及springboot集成使用示例詳解

 更新時間:2023年06月06日 11:40:35   作者:liuyunshengsir  
XXL-Job是一個分布式任務調(diào)度平臺,可進行任務調(diào)度、管理和監(jiān)控,并提供任務分片、失敗重試、動態(tài)分配等功能,這篇文章主要介紹了xxl-job的部署及springboot集成使用,需要的朋友可以參考下

介紹

XXL-Job是一個分布式任務調(diào)度平臺,可進行任務調(diào)度、管理和監(jiān)控,并提供任務分片、失敗重試、動態(tài)分配等功能。它是一個開源項目,基于Spring Boot和Quartz開發(fā),支持常見的任務調(diào)度場景。

XXL-Job的使用相對簡單,只需要簡單配置即可實現(xiàn)任務調(diào)度。同時,它提供了豐富的管理和監(jiān)控功能,可以方便地查看任務執(zhí)行狀態(tài)、日志等。

在企業(yè)中,XXL-Job廣泛應用于一些大型、分布式的系統(tǒng)中,如電商系統(tǒng)、金融系統(tǒng)等。它的高性能、高可靠性、易使用性等特點深受用戶的喜愛。

1.安裝mysql

docker run -d \
--name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root1234567 \
mysql:8.0

2.初始化下載的數(shù)據(jù)

https://github.com/xuxueli/xxl-job/releases
https://github.com/xuxueli/xxl-job/archive/refs/tags/2.4.0.tar.gz
解壓后執(zhí)行xxl-job-2.4.0.tar\xxl-job-2.4.0\doc\db\tables_xxl_job.sql

3.啟動xxl-job-admin

默認登錄 admin/123456

docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://172.24.31.53:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
 --spring.datasource.username=root --spring.datasource.password=root1234567" -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin  -d  xuxueli/xxl-job-admin:2.4.0

http://172.24.31.53:8080/xxl-job-admin/

3.springboot集成

3.1依賴

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

3.2配置

xxl:
  job:
    admin:
      addresses: http://101.200.153.111:8080/xxl-job-admin
    accessToken: default_token
    executor:
      appname: xxl-job-executor-sample
      address:
      ip: 101.200.153.111
      port: 4567
      logpath: /data/applogs/xxl-job/jobhandler
      logretentiondays: 30

3.3代碼

package com.lys.lys_admin_api.xxl;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
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 https://liuyunshengsir.blog.csdn.net/
 */
@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;
    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        logger.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setAddress(address);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
        return xxlJobSpringExecutor;
    }
    /**
     * 針對多網(wǎng)卡、容器內(nèi)部署等情況,可借助 "spring-cloud-commons" 提供的 "InetUtils" 組件靈活定制注冊IP;
     *
     *      1、引入依賴:
     *          <dependency>
     *             <groupId>org.springframework.cloud</groupId>
     *             <artifactId>spring-cloud-commons</artifactId>
     *             <version>${version}</version>
     *         </dependency>
     *
     *      2、配置文件,或者容器啟動變量
     *          spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
     *
     *      3、獲取IP
     *          String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
     */
}

jobhandler 樣例

package com.lys.lys_admin_api.xxl.jobhandler;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
/**
 * XxlJob開發(fā)示例(Bean模式)
 *
 * 開發(fā)步驟:
 *      1、任務開發(fā):在Spring Bean實例中,開發(fā)Job方法;
 *      2、注解配置:為Job方法添加注解 "@XxlJob(value="自定義jobhandler名稱", init = "JobHandler初始化方法", destroy = "JobHandler銷毀方法")",注解value值對應的是調(diào)度中心新建任務的JobHandler屬性的值。
 *      3、執(zhí)行日志:需要通過 "XxlJobHelper.log" 打印執(zhí)行日志;
 *      4、任務結(jié)果:默認任務結(jié)果為 "成功" 狀態(tài),不需要主動設置;如有訴求,比如設置任務結(jié)果為失敗,可以通過 "XxlJobHelper.handleFail/handleSuccess" 自主設置任務結(jié)果;
 *
 * @author https://liuyunshengsir.blog.csdn.net/
 */
@Component
public class SampleXxlJob {
    private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class);
    /**
     * 1、簡單任務示例(Bean模式)
     */
    @XxlJob("demoJobHandlerLYS")
    public void demoJobHandler() throws Exception {
        XxlJobHelper.log("XXL-JOB, Hello World.");
        for (int i = 0; i < 5; i++) {
            XxlJobHelper.log("beat at:" + i);
            TimeUnit.SECONDS.sleep(2);
        }
        // default success
    }
    /**
     * 2、分片廣播任務
     */
    @XxlJob("shardingJobHandler")
    public void shardingJobHandler() throws Exception {
        // 分片參數(shù)
        int shardIndex = XxlJobHelper.getShardIndex();
        int shardTotal = XxlJobHelper.getShardTotal();
        XxlJobHelper.log("分片參數(shù):當前分片序號 = {}, 總分片數(shù) = {}", shardIndex, shardTotal);
        // 業(yè)務邏輯
        for (int i = 0; i < shardTotal; i++) {
            if (i == shardIndex) {
                XxlJobHelper.log("第 {} 片, 命中分片開始處理", i);
            } else {
                XxlJobHelper.log("第 {} 片, 忽略", i);
            }
        }
    }
    /**
     * 3、命令行任務
     */
    @XxlJob("commandJobHandler")
    public void commandJobHandler() throws Exception {
        String command = XxlJobHelper.getJobParam();
        int exitValue = -1;
        BufferedReader bufferedReader = null;
        try {
            // command process
            ProcessBuilder processBuilder = new ProcessBuilder();
            processBuilder.command(command);
            processBuilder.redirectErrorStream(true);
            Process process = processBuilder.start();
            //Process process = Runtime.getRuntime().exec(command);
            BufferedInputStream bufferedInputStream = new BufferedInputStream(process.getInputStream());
            bufferedReader = new BufferedReader(new InputStreamReader(bufferedInputStream));
            // command log
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                XxlJobHelper.log(line);
            }
            // command exit
            process.waitFor();
            exitValue = process.exitValue();
        } catch (Exception e) {
            XxlJobHelper.log(e);
        } finally {
            if (bufferedReader != null) {
                bufferedReader.close();
            }
        }
        if (exitValue == 0) {
            // default success
        } else {
            XxlJobHelper.handleFail("command exit value("+exitValue+") is failed");
        }
    }
    /**
     * 4、跨平臺Http任務
     *  參數(shù)示例:
     *      "url: http://www.baidu.com\n" +
     *      "method: get\n" +
     *      "data: content\n";
     */
    @XxlJob("httpJobHandler")
    public void httpJobHandler() throws Exception {
        // param parse
        String param = XxlJobHelper.getJobParam();
        if (param==null || param.trim().length()==0) {
            XxlJobHelper.log("param["+ param +"] invalid.");
            XxlJobHelper.handleFail();
            return;
        }
        String[] httpParams = param.split("\n");
        String url = null;
        String method = null;
        String data = null;
        for (String httpParam: httpParams) {
            if (httpParam.startsWith("url:")) {
                url = httpParam.substring(httpParam.indexOf("url:") + 4).trim();
            }
            if (httpParam.startsWith("method:")) {
                method = httpParam.substring(httpParam.indexOf("method:") + 7).trim().toUpperCase();
            }
            if (httpParam.startsWith("data:")) {
                data = httpParam.substring(httpParam.indexOf("data:") + 5).trim();
            }
        }
        // param valid
        if (url==null || url.trim().length()==0) {
            XxlJobHelper.log("url["+ url +"] invalid.");
            XxlJobHelper.handleFail();
            return;
        }
        if (method==null || !Arrays.asList("GET", "POST").contains(method)) {
            XxlJobHelper.log("method["+ method +"] invalid.");
            XxlJobHelper.handleFail();
            return;
        }
        boolean isPostMethod = method.equals("POST");
        // request
        HttpURLConnection connection = null;
        BufferedReader bufferedReader = null;
        try {
            // connection
            URL realUrl = new URL(url);
            connection = (HttpURLConnection) realUrl.openConnection();
            // connection setting
            connection.setRequestMethod(method);
            connection.setDoOutput(isPostMethod);
            connection.setDoInput(true);
            connection.setUseCaches(false);
            connection.setReadTimeout(5 * 1000);
            connection.setConnectTimeout(3 * 1000);
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
            connection.setRequestProperty("Accept-Charset", "application/json;charset=UTF-8");
            // do connection
            connection.connect();
            // data
            if (isPostMethod && data!=null && data.trim().length()>0) {
                DataOutputStream dataOutputStream = new DataOutputStream(connection.getOutputStream());
                dataOutputStream.write(data.getBytes("UTF-8"));
                dataOutputStream.flush();
                dataOutputStream.close();
            }
            // valid StatusCode
            int statusCode = connection.getResponseCode();
            if (statusCode != 200) {
                throw new RuntimeException("Http Request StatusCode(" + statusCode + ") Invalid.");
            }
            // result
            bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
            StringBuilder result = new StringBuilder();
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                result.append(line);
            }
            String responseMsg = result.toString();
            XxlJobHelper.log(responseMsg);
            return;
        } catch (Exception e) {
            XxlJobHelper.log(e);
            XxlJobHelper.handleFail();
            return;
        } finally {
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
                if (connection != null) {
                    connection.disconnect();
                }
            } catch (Exception e2) {
                XxlJobHelper.log(e2);
            }
        }
    }
    /**
     * 5、生命周期任務示例:任務初始化與銷毀時,支持自定義相關邏輯;
     */
    @XxlJob(value = "demoJobHandler2", init = "init", destroy = "destroy")
    public void demoJobHandler2() throws Exception {
        XxlJobHelper.log("XXL-JOB, Hello World.");
    }
    public void init(){
        logger.info("init");
    }
    public void destroy(){
        logger.info("destroy");
    }
}

3.4 頁面查看

到此這篇關于xxl-job的部署及springboot集成使用的文章就介紹到這了,更多相關springboot xxl-job部署內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解Springboot-MyBatis配置-配置端口號與服務路徑(idea社區(qū)版2023.1.4+apache-maven-3.9.3-bin)

    詳解Springboot-MyBatis配置-配置端口號與服務路徑(idea社區(qū)版2023.1.4+apache-mav

    這篇文章主要介紹了Springboot-MyBatis配置-配置端口號與服務路徑(idea社區(qū)版2023.1.4+apache-maven-3.9.3-bin),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Java中本地緩存的4種實現(xiàn)方式總結(jié)

    Java中本地緩存的4種實現(xiàn)方式總結(jié)

    這篇文章主要介紹了Java中本地緩存的4種實現(xiàn)方式,分別是基礎緩存實現(xiàn)、GuavaLoadingCache、SpringBoot整合Caffeine和JetCache,通過實例代碼,詳細講解了每種緩存技術的特點和使用方法,需要的朋友可以參考下
    2025-04-04
  • IDEA代碼熱部署和熱加載的三種實現(xiàn)方案

    IDEA代碼熱部署和熱加載的三種實現(xiàn)方案

    在日常開發(fā)中,我們需要經(jīng)常修改 Java 代碼,手動重啟項目,查看修改后的效果,如果在項目小時,重啟速度比較快,等待的時間是較短的,我們可以使用代碼熱加載和熱部署解決該問題,本文給大家介紹了三種實現(xiàn)方案,需要的朋友可以參考下
    2023-11-11
  • 詳解RocketMQ 消費端如何監(jiān)聽消息

    詳解RocketMQ 消費端如何監(jiān)聽消息

    這篇文章主要為大家介紹了RocketMQ 消費端如何監(jiān)聽消息示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • SpringBoot上傳文件大小受限問題的解決辦法

    SpringBoot上傳文件大小受限問題的解決辦法

    最近有一次由于項目升級發(fā)現(xiàn)了一個上傳方面的問題,下面這篇文章主要給大家介紹了關于SpringBoot上傳文件大小受限問題的解決辦法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • RabbitMQ集群實現(xiàn)消息的高可用性和負載均衡

    RabbitMQ集群實現(xiàn)消息的高可用性和負載均衡

    文章解釋了RabbitMQ集群的概念及其構(gòu)建目的,詳細闡述了其底層原理,包括Erlang/OTP的分布式基因、ErlangCookie認證和分布式進程管理,感興趣的朋友跟隨小編一起看看吧
    2026-04-04
  • kotlin快速入門之標準函數(shù)與靜態(tài)方法

    kotlin快速入門之標準函數(shù)與靜態(tài)方法

    學完了Kotlin的基礎知識,是時候來來學習 Kotlin的標準函數(shù)和靜態(tài)方法了,下面這篇文章主要給大家介紹了關于kotlin快速入門之標準函數(shù)與靜態(tài)方法的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-09-09
  • 四個Java必須知道的負載均衡算法分享

    四個Java必須知道的負載均衡算法分享

    我們在設計系統(tǒng)的時候,為了系統(tǒng)的高擴展性,會創(chuàng)建無狀態(tài)的系統(tǒng)。但是,要使系統(tǒng)具有更好的可擴展性,除了無狀態(tài)設計之外,還要考慮采用什么負載均衡算法,本文就帶領大家認識以下常見的4種負載均衡算法
    2023-01-01
  • Springmvc如何實現(xiàn)向前臺傳遞數(shù)據(jù)

    Springmvc如何實現(xiàn)向前臺傳遞數(shù)據(jù)

    這篇文章主要介紹了Springmvc如何實現(xiàn)向前臺傳遞數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • 淺談Springboot實現(xiàn)攔截器的兩種方式

    淺談Springboot實現(xiàn)攔截器的兩種方式

    本文詳細的介紹了Springboot攔截器的兩種方式實現(xiàn),一種就是用攔截器,一種就是過濾器,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評論

石柱| 汉中市| 新平| 德安县| 普格县| 宜阳县| 思南县| 益阳市| 陆良县| 南汇区| 栖霞市| 垫江县| 哈巴河县| 库伦旗| 元阳县| 灵丘县| 铜山县| 信宜市| 景东| 湘阴县| 玉溪市| 博兴县| 龙岩市| 石阡县| 息烽县| 蓬莱市| 鄢陵县| 辽中县| 东光县| 化德县| 吉安市| 昭苏县| 浦县| 仁化县| 鄂尔多斯市| 松潘县| 平度市| 婺源县| 通道| 阳谷县| 石阡县|