国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring@Scheduled定時任務接入XXL-JOB的一種方案(基于SC Gateway)

這篇具有很好參考價值的文章主要介紹了Spring@Scheduled定時任務接入XXL-JOB的一種方案(基于SC Gateway)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

背景

目前在職的公司,維護著Spring Cloud分布式微服務項目有25+個。其中有10個左右微服務都寫有定時任務邏輯,采用Spring @Scheduled這種方式。

Spring @Scheduled定時任務的缺點:

  1. 不支持集群:為避免重復執(zhí)行,需引入分布式鎖
  2. 死板不靈活:不支持手動執(zhí)行,單次執(zhí)行,補償執(zhí)行,修改任務參數(shù),暫停任務,刪除任務,修改調度時間,失敗重試
  3. 無報警機制:任務失敗之后沒有報警機制,邏輯執(zhí)行異常記錄ERROR日志接入Prometheus告警這種方式不算,這算是日志層面的告警,而不是任務層面的告警機制
  4. 不支持分片任務:處理有序數(shù)據(jù)時,多機器分片執(zhí)行任務處理不同數(shù)據(jù)
  5. ……

基于此,考慮引入輕量級分布式定時調度框架XXL-JOB,即把定時任務遷到XXL-JOB平臺。

關于XXL-JOB,可參考之前的blog。

設計方案

考慮到我們有10+個SC分布式應用,30+個定時任務。如果每個應用都需要遷移改造的話,則每個應用都需要配置XXL-JOB相關的信息。當然,這可以通過Apollo namespace共享繼承機制來實現(xiàn)。題外話:有空的話,后面會寫一篇Apollo namespace配置繼承的blog。

也就是說,我可以在一個應用里(一個應用對應著一個Apollo namespace)的Apollo里維護好XXL-JOB的配置信息,其他應用通過復用此應用(的Apollo)來實現(xiàn)配置復用。

但是每個應用還得新增一個配置類,配置類怎么實現(xiàn)復用呢?這也能解決。解決方案就是在commons組件庫里維護配置類(需要引入Spring @Configuration注解,即引入spring-context依賴包),然后每個應用的Spring Boot啟動類里需要掃描到此配置類。

還得改造一下30+個定時任務對應的30+個@@Component定時任務類,所有的定時任務應用都需要引入maven依賴。

還得手動在XXL-JOB里新增定時任務類。

看起來還不錯的方案,但是不排除不同的應用有同名的配置,遇到同名的配置,則需要修改配置命名。Spring Boot啟動類改造可能會帶來未知的問題。

最后的最后,考慮到我們所有的應用都需要經(jīng)過Gateway網(wǎng)關服務來轉發(fā),不管是對內的應用,還是對外的應用,對外的應用有包括C端,B端,和第三方客戶。故而有下面的最終方案。

實現(xiàn)方案

在對內的網(wǎng)關應用里,引入maven依賴:

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

新增如下XXL-JOB配置類:

@Slf4j
@Configuration
public class XxlJobConfig {
    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;
    @Value("${xxl.job.executor.appname}")
    private String appName;
    @Value("${xxl.job.executor.port:9999}")
    private int port;
    @Value("${xxl.job.accessToken:default_token}")
    private String accessToken;

    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        log.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor executor = new XxlJobSpringExecutor();
        executor.setAdminAddresses(adminAddresses);
        executor.setAppname(appName);
        executor.setPort(port);
        executor.setAccessToken(accessToken);
        return executor;
    }
}

對應的,需要在Apollo里新增如下配置。其中有些配置是固定不變的,可以放在本地配置文件里;未來有可能變化的,放在Apollo里。
Spring@Scheduled定時任務接入XXL-JOB的一種方案(基于SC Gateway),Spring Cloud,gateway
這里的appname實際上就是XXL-JOB的執(zhí)行器:
Spring@Scheduled定時任務接入XXL-JOB的一種方案(基于SC Gateway),Spring Cloud,gateway
gateway服務是以pod形式運行在k8s集群里,不言而喻,采用自動注冊這種方式。

網(wǎng)關服務里新增定時任務解析,請求轉發(fā)配置類:

@Slf4j
@Component
public class XxlJobLogicConfig {
	private static final String URL = "url:";
	private static final String METHOD = "method:";
	private static final String DATA = "data:";
	private static final String GET = "GET";
	private static final String POST = "POST";

    @XxlJob("httpJobHandler")
    public void httpJobHandler() {
    	// 參數(shù)解析及校驗
        String jobParam = XxlJobHelper.getJobParam();
        if (StringUtils.isBlank(jobParam)) {
            XxlJobHelper.log("param[" + jobParam + "] invalid");
            XxlJobHelper.handleFail();
            return;
        }
        String[] httpParams = jobParam.split("\n");
        String url = "";
        String method = "";
        String data = "null";
        for (String httpParam : httpParams) {
            if (httpParam.startsWith(URL)) {
                url = httpParam.substring(httpParam.indexOf(URL) + URL.length()).trim();
            }
            if (httpParam.startsWith(METHOD)) {
                method = httpParam.substring(httpParam.indexOf(METHOD) + METHOD.length()).trim().toUpperCase();
            }
            if (httpParam.startsWith(DATA)) {
                data = httpParam.substring(httpParam.indexOf(DATA) + DATA.length()).trim();
            }
        }
        if (StringUtils.isBlank(url)) {
            XxlJobHelper.log("url[" + url + "] invalid");
            XxlJobHelper.handleFail();
            return;
        }
        if (!GET.equals(method) && !POST.equals(method)) {
            XxlJobHelper.log("method[" + method + "] invalid");
            XxlJobHelper.handleFail();
            return;
        }
        log.info("xxlJob調度請求url={},請求method={},請求數(shù)據(jù)data={}", url, method, data);
        // 判斷是否為POST請求
        boolean isPostMethod = POST.equals(method);
        HttpURLConnection connection = null;
        BufferedReader bufferedReader = null;
        try {
            URL realUrl = new URL(url);
            connection = (HttpURLConnection) realUrl.openConnection();
            // 設置具體的方法,也就是具體的定時任務
            connection.setRequestMethod(method);
            // POST請求需要output
            connection.setDoOutput(isPostMethod);
            connection.setDoInput(true);
            connection.setUseCaches(false);
            connection.setReadTimeout(900 * 1000);
            connection.setConnectTimeout(600 * 1000);
            // connection:Keep-Alive 表示在一次http請求中,服務器進行響應后,不再直接斷開TCP連接,而是將TCP連接維持一段時間。
            // 在這段時間內,如果同一客戶端再次向服務端發(fā)起http請求,便可以復用此TCP連接,向服務端發(fā)起請求。
            connection.setRequestProperty("connection", "keep_alive");
            // Content-Type 表示客戶端向服務端發(fā)送的數(shù)據(jù)的媒體類型(MIME類型)
            connection.setRequestProperty("content-type", "application/json;charset=UTF-8");
            // Accept-Charset 表示客戶端希望服務端返回的數(shù)據(jù)的媒體類型(MIME類型)
            connection.setRequestProperty("Accept-Charset", "application/json;charset=UTF-8");
            // gateway請求轉發(fā)到其他應用
            connection.connect();
            // 如果是POST請求,則判斷定時任務是否含有執(zhí)行參數(shù)
            if (isPostMethod && StringUtils.isNotBlank(data)) {
                DataOutputStream dataOutputStream = new DataOutputStream(connection.getOutputStream());
                // 寫參數(shù)
                dataOutputStream.write(data.getBytes(Charset.defaultCharset()));
                dataOutputStream.flush();
                dataOutputStream.close();
            }
            int responseCode = connection.getResponseCode();
            // 判斷請求轉發(fā)、定時任務觸發(fā)是否成功
            if (responseCode != 200) {
                throw new RuntimeException("Http Request StatusCode(" + responseCode + ") Invalid");
            }
            bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charset.defaultCharset()));
            StringBuilder stringBuilder = new StringBuilder();
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                stringBuilder.append(line);
            }
            String responseMsg = stringBuilder.toString();
            log.info("xxlJob調度執(zhí)行返回數(shù)據(jù)={}", responseMsg);
            XxlJobHelper.log(responseMsg);
        } catch (Exception e) {
            XxlJobHelper.log(e);
            XxlJobHelper.handleFail();
        } finally {
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
                if (connection != null) {
                    connection.disconnect();
                }
            } catch (Exception e) {
                XxlJobHelper.log(e);
            }
        }
    }
}

稍微有點麻煩的是,每個Spring Cloud應用都需要手動新增一個ScheduleController:

/**
 * 定時任務入口,所有服務的@RequestMapping滿足/schedule/appName這種格式,方便統(tǒng)一管理
 **/
@RestController
@RequestMapping("/schedule/search")
public class ScheduleController {
    @Resource
    private ChineseEnglishStoreSchedule chineseEnglishStoreSchedule;

    @GetMapping("/chineseEnglishStoreSchedule")
    public Response<Boolean> chineseEnglishStoreSchedule() {
        chineseEnglishStoreSchedule.execute();
        return Response.success(true);
    }
}

另外,需要在gateway網(wǎng)關服務里新增路由轉發(fā)規(guī)則:
Spring@Scheduled定時任務接入XXL-JOB的一種方案(基于SC Gateway),Spring Cloud,gateway
每個有定時任務,且準備接入XXL-JOB平臺的SC微服務,都需要新增類似上面截圖里的4條配置信息。

優(yōu)點:所有帶有定時任務的服務一目了然,方便統(tǒng)一維護和管理。

這種方案無需改造具體的某個Schedule類:

@JobHander(value = "autoJobHandler")
public class AutoJobHandler extends IJobHandler {
	@Override
    public ReturnT<String> execute(String... params) {
    try {
    	// 既有的業(yè)務邏輯
    	// 執(zhí)行成功
    	return ReturnT.SUCCESS;
    } catch (Exception e) {
            logger.error("execute error id:{}, error info:{}", id, e);
            return ReturnT.FAIL;
        }
        return ReturnT.SUCCESS;
    }
}

最后都省卻不了的一個步驟,在XXL-JOB admin管理平臺新增一個個任務:
Spring@Scheduled定時任務接入XXL-JOB的一種方案(基于SC Gateway),Spring Cloud,gateway

驗證

任務調度的執(zhí)行日志:
Spring@Scheduled定時任務接入XXL-JOB的一種方案(基于SC Gateway),Spring Cloud,gateway
ELK日志查詢平臺里也可以搜索到邏輯代碼里打印的日志。文章來源地址http://www.zghlxwxcb.cn/news/detail-665597.html

參考

到了這里,關于Spring@Scheduled定時任務接入XXL-JOB的一種方案(基于SC Gateway)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【分布式任務調度平臺 XXL-JOB 急速入門】從零開始將 XXL-JOB 接入到自己的項目

    【分布式任務調度平臺 XXL-JOB 急速入門】從零開始將 XXL-JOB 接入到自己的項目

    ??????????????????????????????? ?? 分布式任務調度平臺 X X L ? J O B 急速入門:從零開始將 X X L ? J O B 接入到自己的項目 color{#FF1493}{分布式任務調度平臺 XXL-JOB 急速入門:從零開始將 XXL-JOB 接入到自己的項目} 分布式任務調度平臺 XX L ? J OB 急速入門:從零

    2024年02月14日
    瀏覽(19)
  • XXL-JOB定時任務框架(Oracle定制版)

    XXL-JOB定時任務框架(Oracle定制版)

    xxl-job是一個輕量級、易擴展的分布式任務調度平臺,能夠快速開發(fā)和簡單學習。開放源代碼并被多家公司線上產(chǎn)品使用,開箱即用。盡管其確實非常好用,但我在工作中使用的是Oracle數(shù)據(jù)庫,因為xxl-job是針對MySQL設計的,所以使用起來需要進行一些魔改。為了方便后人使用,

    2023年04月13日
    瀏覽(25)
  • 分布式定時任務-XXL-JOB-教程+實戰(zhàn)

    分布式定時任務-XXL-JOB-教程+實戰(zhàn)

    1.定時任務認識 1.1.什么是定時任務 定時任務是按照指定時間周期運行任務。使用場景為在某個固定時間點執(zhí)行,或者周期性的去執(zhí)行某個任務,比如:每天晚上24點做數(shù)據(jù)匯總,定時發(fā)送短信等。 1.2.常見定時任務方案 While + Sleep : 通過循環(huán)加休眠的方式定時執(zhí)行 Timer和Time

    2024年02月16日
    瀏覽(31)
  • SpringBoot 集成 xxl-job 實現(xiàn)定時任務管理

    SpringBoot 集成 xxl-job 實現(xiàn)定時任務管理

    XXL-Job是一個功能強大的分布式任務調度框架,集成了Spring Boot后能夠發(fā)揮更大的優(yōu)勢。它提供了分布式任務調度、任務執(zhí)行報告、任務調度中心、良好的擴展性、分布式集群部署、監(jiān)控與報警等多種優(yōu)勢。此外,XXL-Job是開源免費的,可以在GitHub上獲取源代碼和詳細文檔。詳細

    2024年02月09日
    瀏覽(33)
  • springcloud:快速上手定時任務框架xxl-job(十五)

    springcloud:快速上手定時任務框架xxl-job(十五)

    實際開發(fā)中,我們常常遇到需要定時執(zhí)行的任務,我們可以利用定時線程池或schedule框架等來實現(xiàn)定時任務,但這些方式都有效率、性能上的缺陷,在微服務框架下,我們期望一種更加規(guī)整、輕量、可靠的定時任務框架來幫助我們實現(xiàn)定時任務,以及可視化的管理定時任務。

    2023年04月08日
    瀏覽(27)
  • 【手把手】分布式定時任務調度解析之xxl-job

    【手把手】分布式定時任務調度解析之xxl-job

    在之前我寫的講解Quartz中有介紹過,Quartz有差不多二十年的歷史,調度模型已經(jīng)非常成熟了,而且很容易集成到Spring中去,用來執(zhí)行業(yè)務任務是一個很好的選擇。但是越早的設計存在的問題也越明顯,比如: 1、調度邏輯(Scheduler)和任務類耦合在同一個項目中,隨著調度任

    2024年01月19日
    瀏覽(20)
  • 第三代開源定時任務框架PowerJob-比xxl-job 更強大!

    第三代開源定時任務框架PowerJob-比xxl-job 更強大!

    這倒是勾起了我的好奇心,因為前段時間用? xxl-job 替換掉了同樣不太好用的 QuartZ ,那時候還沒有調研 PowerJob。于是這次研究了一番, 發(fā)現(xiàn) PowerJob 確實是個很棒的框架 ,在這里推薦給大家。 PowerJob是新一代分布式任務調度與計算框架,支持CRON、API、固定頻率、固定延遲等

    2023年04月10日
    瀏覽(27)
  • 分布式定時任務系列8:XXL-job源碼分析之遠程調用

    分布式定時任務系列8:XXL-job源碼分析之遠程調用

    分布式定時任務系列1:XXL-job安裝 分布式定時任務系列2:XXL-job使用 分布式定時任務系列3:任務執(zhí)行引擎設計 分布式定時任務系列4:任務執(zhí)行引擎設計續(xù) 分布式定時任務系列5:XXL-job中blockingQueue的應用 分布式定時任務系列6:XXL-job觸發(fā)日志過大引發(fā)的CPU告警 分布式定時任

    2024年01月21日
    瀏覽(78)
  • spring boot + xxl-job 分布式任務調度

    spring boot + xxl-job 分布式任務調度

    1、任務調度 1.1、什么是任務調度 我們可以先思考一下下面業(yè)務場景的解決方案: 某電商系統(tǒng)需要在每天上午10點,下午3點,晚上8點發(fā)放一批優(yōu)惠券。 某財務系統(tǒng)需要在每天上午10點前結算前一天的賬單數(shù)據(jù),統(tǒng)計匯總。 某電商平臺每天凌晨3點,要對訂單中的無效訂單進行

    2024年02月09日
    瀏覽(29)
  • xxl-job定時任務配置應用以及添加到自己已有的springboot項目中實現(xiàn)動態(tài)API調用

    xxl-job定時任務配置應用以及添加到自己已有的springboot項目中實現(xiàn)動態(tài)API調用

    XXL-JOB是一個分布式任務調度平臺,其核心設計目標是開發(fā)迅速、學習簡單、輕量級、易擴展?,F(xiàn)已開放源代碼并接入多家公司線上產(chǎn)品線,開箱即用。 本篇文章主要是對xuxueli的xxl-job做一個簡單的配置,以及將其添加到自己已有的項目中進行api調用。 一、xxl-job安裝 1、首先

    2024年02月03日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包