欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

介紹

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

XXL-Job的使用相對簡單,只需要簡單配置即可實現(xiàn)任務調度。同時,它提供了豐富的管理和監(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;
    }
    /**
     * 針對多網卡、容器內部署等情況,可借助 "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值對應的是調度中心新建任務的JobHandler屬性的值。
 *      3、執(zhí)行日志:需要通過 "XxlJobHelper.log" 打印執(zhí)行日志;
 *      4、任務結果:默認任務結果為 "成功" 狀態(tài),不需要主動設置;如有訴求,比如設置任務結果為失敗,可以通過 "XxlJobHelper.handleFail/handleSuccess" 自主設置任務結果;
 *
 * @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部署內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 一文詳解如何在Java?Maven項目中使用JUnit?5進行測試

    一文詳解如何在Java?Maven項目中使用JUnit?5進行測試

    這篇文章主要介紹了如何在Java?Maven項目中使用JUnit?5進行測試的相關資料,JUnit5是一個流行的Java測試框架,它涵蓋了JUnit5的概述、環(huán)境配置、編寫測試用例、運行測試、高級特性和最佳實踐,需要的朋友可以參考下
    2025-04-04
  • Java直接輸出對象變成@.....的問題及解決

    Java直接輸出對象變成@.....的問題及解決

    這篇文章主要介紹了Java直接輸出對象變成@.....的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • springboot整合quartz項目使用案例

    springboot整合quartz項目使用案例

    quartz是一個定時調度的框架,就目前市場上來說,其實有比quartz更優(yōu)秀的一些定時調度框架,不但性能比quartz好,學習成本更低,而且還提供可視化操作定時任務,這篇文章主要介紹了springboot整合quartz項目使用(含完整代碼),需要的朋友可以參考下
    2023-05-05
  • 詳解Java爬蟲利器Jsoup

    詳解Java爬蟲利器Jsoup

    Jsoup是一款Java語言開發(fā)的HTML解析器,用于解析HTML文檔以及對HTML文檔進行操作,處理等,本文就將詳細給大家介紹一下Java中的爬蟲利器Jsoup,感興趣的同學可以參考一下
    2023-06-06
  • Java實現(xiàn)文件變化監(jiān)聽代碼實例

    Java實現(xiàn)文件變化監(jiān)聽代碼實例

    這篇文章主要介紹了Java實現(xiàn)文件變化監(jiān)聽代碼實例,通過定時任務,輪訓查詢文件的最后修改時間,與上一次進行對比,如果發(fā)生變化,則說明文件已經修改,進行重新加載或對應的業(yè)務邏輯處理,需要的朋友可以參考下
    2024-01-01
  • Java 使用IO流實現(xiàn)大文件的分割與合并實例詳解

    Java 使用IO流實現(xiàn)大文件的分割與合并實例詳解

    這篇文章主要介紹了Java 使用IO流實現(xiàn)大文件的分割與合并實例詳解的相關資料,需要的朋友可以參考下
    2016-12-12
  • SpringBoot自動配置@EnableAutoConfiguration過程示例

    SpringBoot自動配置@EnableAutoConfiguration過程示例

    這篇文章主要為大家介紹了SpringBoot自動配置@EnableAutoConfiguration的過程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Java數(shù)組去重復的18種方法示例

    Java數(shù)組去重復的18種方法示例

    這篇文章主要為大家介紹了Java數(shù)組去重復的18種寫法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • JSON序列化Redis讀取出錯問題解決方案

    JSON序列化Redis讀取出錯問題解決方案

    這篇文章主要介紹了JSON序列化Redis讀取出錯問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • Java中結束循環(huán)的方法

    Java中結束循環(huán)的方法

    這篇文章主要介紹了Java中結束循環(huán)的方法,文中有段代碼在return,結束了整個main方法,即使輸出hello world的語句位于循環(huán)體外,也不會被執(zhí)行,對java結束循環(huán)方法感興趣的朋友跟隨小編一起看看吧
    2023-06-06

最新評論