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

SpringBoot整合XXLJob的實現(xiàn)示例

 更新時間:2025年09月16日 09:12:22   作者:Naylor  
XXLJob是大眾點(diǎn)評開源的分布式任務(wù)調(diào)度平臺,支持Cron、固定間隔等觸發(fā)方式,本文主要介紹了SpringBoot整合XXLJob的實現(xiàn)示例,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

XXLJob簡介

XXLJob是一個分布式任務(wù)調(diào)度平臺,優(yōu)點(diǎn):開發(fā)迅速、學(xué)習(xí)簡單、輕量級、易擴(kuò)展。是大眾點(diǎn)評員工xxl創(chuàng)建并維護(hù),基于 GPL-3.0 開源,可放心商用,目前已經(jīng)擁有龐大的使用群體。

簡單來說,就是一個定時任務(wù)中間件,類似的產(chǎn)品有當(dāng)當(dāng)網(wǎng)開源的Elastic-Job。

特性

  • 簡單:產(chǎn)品本身基于Java開發(fā)的,鑒于JVM的優(yōu)秀,安裝部署集成簡單,和其他中間件、框架相比,避免了各種環(huán)境問題;同時程序員在項目中集成進(jìn)來也很簡單,有手就行。
  • 觸發(fā)策略豐富:按照設(shè)置的Cron表達(dá)式觸發(fā)、固定間隔觸發(fā)、固定延時觸發(fā)、API(事件)觸發(fā)、人工觸發(fā)、父子任務(wù)觸發(fā)
  • 支持失敗重試
  • 包含簡單的告警和豐富的log,玩過定時任務(wù)的都知道,可觀測性在實際項目中是多么的關(guān)鍵
  • 支持任務(wù)分片:例如將一個大任務(wù),拆分為多個小任務(wù),然后分給不同的執(zhí)行器節(jié)點(diǎn)同時執(zhí)行
  • 數(shù)據(jù)加密:調(diào)度中心和執(zhí)行器之間的通訊進(jìn)行數(shù)據(jù)加密,提升調(diào)度信息安全性
  • 豐富的鉤子:各種回調(diào)可細(xì)粒度觀察任務(wù)的生命周期
  • 跨語言:調(diào)度中心與執(zhí)行器提供語言無關(guān)的 RESTful API 服務(wù),第三方任意語言可據(jù)此對接調(diào)度中心或者實現(xiàn)執(zhí)行器。除此之外,還提供了 “多任務(wù)模式”和“httpJobHandler”等其他跨語言方案;
  • 容器化:對云原生支持友好
  • 有webUI管理系統(tǒng)
  • 高可用:支持集群部署,可彈性擴(kuò)容
  • 自動發(fā)現(xiàn):執(zhí)行器會周期性自動注冊任務(wù), 調(diào)度中心將會自動發(fā)現(xiàn)注冊上來的執(zhí)行器并將任務(wù)分配給執(zhí)行器同時觸發(fā)執(zhí)行

模塊

  • 調(diào)度中心:管理執(zhí)行器、任務(wù);查看任務(wù)日志、告警、報表;提供一個webUI管理系統(tǒng),有簡單的用戶登錄賬號管理功能;依賴數(shù)據(jù)庫
  • 執(zhí)行器:執(zhí)行器是獨(dú)立的RESTFul服務(wù),一般集成在業(yè)務(wù)服務(wù)中,它會開辟一個9999(默認(rèn))端口和調(diào)度中心交互

由上可知,XXLJob為C/S架構(gòu),調(diào)度中心本身可以高可用部署,執(zhí)行器集成在業(yè)務(wù)微服務(wù)中,當(dāng)業(yè)務(wù)微服務(wù)多實例部署的時候,執(zhí)行器也就可以達(dá)到分布式和高可用了。

安裝調(diào)度中心

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

調(diào)度中心依賴數(shù)據(jù)庫,安裝前需先初始化數(shù)據(jù)庫

表說明:

  • xxl_job_lock:任務(wù)調(diào)度鎖表
  • xxl_job_group:執(zhí)行器信息表,維護(hù)任務(wù)執(zhí)行器信息
  • xxl_job_info:調(diào)度擴(kuò)展信息表: 用于保存XXL-JOB調(diào)度任務(wù)的擴(kuò)展信息,如任務(wù)分組、任務(wù)名、機(jī)器地址、執(zhí)行器、執(zhí)行入?yún)⒑蛨缶]件等等
  • xxl_job_log:調(diào)度日志表: 用于保存XXL-JOB任務(wù)調(diào)度的歷史信息,如調(diào)度結(jié)果、執(zhí)行結(jié)果、調(diào)度入?yún)?、調(diào)度機(jī)器和執(zhí)行器等等
  • xxl_job_log_report:調(diào)度日志報表:用戶存儲XXL-JOB任務(wù)調(diào)度日志的報表,調(diào)度中心報表功能頁面會用到
  • xxl_job_logglue:任務(wù)GLUE日志:用于保存GLUE更新歷史,用于支持GLUE的版本回溯功能
  • xxl_job_registry:執(zhí)行器注冊表,維護(hù)在線的執(zhí)行器和調(diào)度中心機(jī)器地址信息
  • xxl_job_user:系統(tǒng)用戶表;

配置

  • 運(yùn)行端口
  • 數(shù)據(jù)庫連接
  • 報警郵箱
  • token:一個串,非必填,設(shè)置之后,執(zhí)行器也需要配置此串,才能和調(diào)度中心交互,相當(dāng)于一個簡單的認(rèn)證
  • 線程池配置

參見官方文檔,本文重點(diǎn)放在SpringBoot整合XXLJob。調(diào)度中心的部署,尤其是高可用部署,后續(xù)單獨(dú)開篇。

啟動

調(diào)度中心就是一個SpringBoot程序,以xxljob2.4.0版本為例,其依賴的SpringBoot版本為 2.7.9,所以任何啟動SpringBoot 的方式都可以,webui的默認(rèn)訪問地址:http://ip:8080/xxl-job-admin 

整合執(zhí)行器

pom

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

yml

server:
  port: 9009
logging:
  level:
    com.ramble: debug
xxl:
  job:
    admin:
      #調(diào)度中心部署根地址 [選填]:如調(diào)度中心集群部署存在多個地址則用逗號分隔。執(zhí)行器將會使用該地址進(jìn)行"執(zhí)行器心跳注冊"和"任務(wù)結(jié)果回調(diào)";為空則關(guān)閉自動注冊;
 addresses: http://127.0.0.1:8080/xxl-job-admin
    #執(zhí)行器通訊TOKEN [選填]:非空時啟用;
    accessToken:
    executor:
      #執(zhí)行器AppName [選填]:執(zhí)行器心跳注冊分組依據(jù);為空則關(guān)閉自動注冊
      appname: xxljob-demo-service
      #${spring.application.name}
      #執(zhí)行器注冊 [選填]:優(yōu)先使用該配置作為注冊地址,為空時使用內(nèi)嵌服務(wù) ”IP:PORT“ 作為注冊地址。從而更靈活的支持容器類型執(zhí)行器動態(tài)IP和動態(tài)映射端口問題。
      address: ""
      #執(zhí)行器IP [選填]:默認(rèn)為空表示自動獲取IP,多網(wǎng)卡時可手動設(shè)置指定IP,該IP不會綁定Host僅作為通訊實用;地址信息用于 "執(zhí)行器注冊" 和 "調(diào)度中心請求并觸發(fā)任務(wù)";
      ip: ""
      #執(zhí)行器端口號 [選填]:小于等于0則自動獲取;默認(rèn)端口為9999,單機(jī)部署多個執(zhí)行器時,注意要配置不同執(zhí)行器端口;
      port: 0
      ###${server-port}
      #執(zhí)行器運(yùn)行日志文件存儲磁盤路徑 [選填] :需要對該路徑擁有讀寫權(quán)限;為空則使用默認(rèn)路徑;
      logpath: ./logs/xxl-job/jobhandler
      #執(zhí)行器日志文件保存天數(shù) [選填] : 過期日志自動清理, 限制值大于等于3時生效; 否則, 如-1, 關(guān)閉自動清理功能;
      logretentiondays: 30

XxlJobConfig

@Slf4j
@Configuration
public class XxlJobConfig {
    @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() {
        log.info(">>>>>>>>>>> start 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;
    }
}

啟動執(zhí)行器

如果一切順利,將在控制臺看到如下輸出:

2023-10-09 11:36:23.162 INFO 15736 --- [ Thread-4] com.xxl.job.core.server.EmbedServer : >>>>>>>>>>> xxl-job remoting server start success, nettype = class com.xxl.job.core.server.EmbedServer, port = 9999

看到這個,說明執(zhí)行器配置已生效,執(zhí)行器已經(jīng)順利和調(diào)度中心聯(lián)系上了。

實踐

可以簡單的將任務(wù)分兩個步驟,第一在執(zhí)行器中定義一個任務(wù)具體需要干什么,第二在調(diào)度中心觸發(fā)定義的任務(wù)

簡單的定時任務(wù)

在執(zhí)行器創(chuàng)建任務(wù)

在業(yè)務(wù)微服務(wù)中創(chuàng)建

@Slf4j
@Component
public class DemoJob {
    /**
     * 簡單的job,調(diào)度器
     */
    @XxlJob("job1")
    public void job1() {
        log.debug("do job1");
    }
}

在調(diào)度中心創(chuàng)建執(zhí)行器

  • 對于調(diào)度中心來說,執(zhí)行器可能是多實例的,通過AppName確定為同一個集群
  • 執(zhí)行器可以手動指定,也可以自動發(fā)現(xiàn)

創(chuàng)建成功之后可以在執(zhí)行器列表看到。圖片為編輯頁面,所以可以看到已經(jīng)有機(jī)器地址了。

在調(diào)度中心創(chuàng)建任務(wù)

  • JobHandler:需要和業(yè)務(wù)微服務(wù)中創(chuàng)建的任務(wù)名稱一致

新增完畢之后啟動,如果一切順利,將可以在業(yè)務(wù)微服務(wù)中看到如下log:

2023-10-09 11:50:33.050 DEBUG 34868 --- [6-1696823413294] com.ramble.xxljob.task.DemoJob : do job1
2023-10-09 11:50:38.044 DEBUG 34868 --- [6-1696823413294] com.ramble.xxljob.task.DemoJob : do job1
2023-10-09 11:50:44.100 DEBUG 34868 --- [6-1696823413294] com.ramble.xxljob.task.DemoJob : do job1
2023-10-09 11:50:48.052 DEBUG 34868 --- [6-1696823413294] com.ramble.xxljob.task.DemoJob : do job1
2023-10-09 11:50:53.043 DEBUG 34868 --- [6-1696823413294] com.ramble.xxljob.task.DemoJob : do job1

每5s執(zhí)行了一次任務(wù)

帶前置和后置處理的定時任務(wù)

XxlJob注解詳解

XxlJob注解有三個參數(shù):

value:JobHandler的名稱,需要在執(zhí)行器和調(diào)度中心保持一致

init:定時任務(wù)前置處理,僅在定時任務(wù)首次運(yùn)行前執(zhí)行一次

destory:定時任務(wù)后置處理,僅在定時任務(wù)銷毀的時候執(zhí)行一次

這里需要注意:

  • 一個定時任務(wù)可能反復(fù)執(zhí)行多次,例如我們設(shè)置了固定10s執(zhí)行一次,那么可能每10s就執(zhí)行一次,但是前置處理和后置處理僅執(zhí)行一次,前置處理和后置處理僅針對整個任務(wù),而非任務(wù)的一次執(zhí)行
  • 在前置處理中拋異常并不會阻止任務(wù)的創(chuàng)建和執(zhí)行
  • 可以在前置處理和后置處理中訪問數(shù)據(jù)庫或者做一些業(yè)務(wù)邏輯

創(chuàng)建帶前(后)置處理的任務(wù)

@Slf4j
@Component
public class DemoJob {
    /**
     * 創(chuàng)建帶前(后)置處理的任務(wù)
     * Job方法添加注解 "@XxlJob(value="自定義jobhandler名稱", init = "JobHandler初始化方法", destroy = "JobHandler銷毀方法")",注解value值對應(yīng)的是調(diào)度中心新建任務(wù)的JobHandler屬性的值。
     * <p>
     * 執(zhí)行日志:需要通過 "XxlJobHelper.log" 打印執(zhí)行日志;
     * <p>
     * 任務(wù)結(jié)果:默認(rèn)任務(wù)結(jié)果為 "成功" 狀態(tài),不需要主動設(shè)置;如有訴求,比如設(shè)置任務(wù)結(jié)果為失敗,可以通過 "XxlJobHelper.handleFail/handleSuccess" 自主設(shè)置任務(wù)結(jié)果;
     */
    @XxlJob(value = "job2", init = "job2Init", destroy = "job2Destroy")
    public void job2() throws InterruptedException {
        LocalDateTime now = LocalDateTime.now();
        XxlJobHelper.log("進(jìn)入job2,time={}", now.toString());
        log.debug("job2 - doSomething ...");
        Thread.sleep(2000);
        XxlJobHelper.log("離開job2,time={}", now.toString());
    }
    public void job2Init() {
        log.debug("job2Init - doSomething ...");
    }
    public void job2Destroy() {
        log.debug("job2Destroy - doSomething ...");
    }
}

調(diào)度中心需要創(chuàng)建對應(yīng)job2的任務(wù)并啟動。如果一切順利將在執(zhí)行器控制臺看到如下log:

2023-10-09 13:31:44.104 DEBUG 35848 --- [7-1696829504104] com.ramble.xxljob.task.DemoJob : job2Init - doSomething ...
2023-10-09 13:31:44.110 DEBUG 35848 --- [7-1696829504104] com.ramble.xxljob.task.DemoJob : job2 - doSomething ...
2023-10-09 13:31:54.052 DEBUG 35848 --- [7-1696829504104] com.ramble.xxljob.task.DemoJob : job2 - doSomething ...
2023-10-09 13:32:04.053 DEBUG 35848 --- [7-1696829504104] com.ramble.xxljob.task.DemoJob : job2 - doSomething ...
2023-10-09 13:32:14.054 DEBUG 35848 --- [7-1696829504104] com.ramble.xxljob.task.DemoJob : job2 - doSomething ...
Disconnected from the target VM, address: '127.0.0.1:50819', transport: 'socket'
2023-10-09 13:32:21.606 INFO 35848 --- [ Thread-4] com.xxl.job.core.server.EmbedServer : >>>>>>>>>>> xxl-job remoting server stop.
2023-10-09 13:32:21.618 INFO 35848 --- [rRegistryThread] c.x.j.c.thread.ExecutorRegistryThread : >>>>>>>>>>> xxl-job registry-remove success, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='xxljob-demo-service', registryValue='http://192.168.3.191:9999/'}, registryResult:ReturnT [code=200, msg=null, content=null]
2023-10-09 13:32:21.618 INFO 35848 --- [rRegistryThread] c.x.j.c.thread.ExecutorRegistryThread : >>>>>>>>>>> xxl-job, executor registry thread destroy.
2023-10-09 13:32:21.621 INFO 35848 --- [ionShutdownHook] com.xxl.job.core.server.EmbedServer : >>>>>>>>>>> xxl-job remoting server destroy success.
2023-10-09 13:32:21.622 DEBUG 35848 --- [7-1696829504104] com.ramble.xxljob.task.DemoJob : job2Destroy - doSomething ...
2023-10-09 13:32:21.622 INFO 35848 --- [7-1696829504104] com.xxl.job.core.thread.JobThread : >>>>>>>>>>> xxl-job JobThread stoped, hashCode:Thread[xxl-job, JobThread-27-1696829504104,10,main]
2023-10-09 13:32:21.623 INFO 35848 --- [FileCleanThread] c.x.j.core.thread.JobLogFileCleanThread : >>>>>>>>>>> xxl-job, executor JobLogFileCleanThread thread destroy.

通過log可以觀測到:

  • 執(zhí)行器啟動的時候,在任務(wù)首次運(yùn)行前打印了init方法中的log
  • 而后定時任務(wù)按照既定執(zhí)行策略執(zhí)行
  • 當(dāng)執(zhí)行器服務(wù)停止的時候,打印了destory方法中的log
  • 通過XxlJobHelper.log 打印的日志,可以在調(diào)度中心 調(diào)度日志--->操作--->執(zhí)行日志 中看到

父子任務(wù)

當(dāng)兩個任務(wù)需要關(guān)聯(lián)觸發(fā)的時候可以使用父子任務(wù)的功能,當(dāng)然了子任務(wù)還可以有子任務(wù)。

這種情況只需要啟動父任務(wù),不需要啟動子任務(wù),當(dāng)父任務(wù)執(zhí)行成功了,會觸發(fā)子任務(wù)的啟動。當(dāng)父任務(wù)執(zhí)行失敗了,不會觸發(fā)子任務(wù)的啟動。

父子執(zhí)行器

 /**
     * 父任務(wù)
     */
     @XxlJob("jobFather")
     public void jobFather() {
         // 創(chuàng)建一個新的隨機(jī)數(shù)生成器
         Random random = new Random();
         // 生成一個0到100之間的隨機(jī)整數(shù)
         int randomNumber = random.nextInt(101);
         if (randomNumber % 2 == 0) {
             log.debug("do - jobFather - success");
             XxlJobHelper.handleSuccess();
         } else {
             log.debug("do - jobFather - fail");
             XxlJobHelper.handleFail("調(diào)用XxlJobHelper.handleFail,調(diào)度中心就任務(wù)此任務(wù)執(zhí)行失敗");
         }
     }
     /**
      * 子任務(wù)
      */
     @XxlJob("jobChild")
     public void jobChild() {
         log.debug("do - jobChild");
     }
  • 父、子執(zhí)行器并沒有什么特殊的地方
  • 在調(diào)度中心手動關(guān)聯(lián)父、子任務(wù)后,父執(zhí)行器執(zhí)行成功后就會觸發(fā)子執(zhí)行器執(zhí)行
  • 上述父執(zhí)行器中通過XxlJobHelper.handleSuccess() 告訴調(diào)度中心,此任務(wù)執(zhí)行成功了
  • 上述父執(zhí)行器中通過XxlJobHelper.handleFail() 告訴調(diào)度中心,此任務(wù)執(zhí)行失敗了,調(diào)度中心將不會觸發(fā)子任務(wù)

關(guān)聯(lián)父子任務(wù)

  • 子任務(wù)、父任務(wù)分別創(chuàng)建
  • 然后編輯父任務(wù),將子任務(wù)的id填寫到“子任務(wù)ID”中,此時就關(guān)聯(lián)上了
  • 啟動父任務(wù),不需要啟動子任務(wù)
  • 子任務(wù)的啟動交由調(diào)度中心觸發(fā),當(dāng)父任務(wù)執(zhí)行成功了,調(diào)度中心自然會啟動子任務(wù)
  • 如果將子任務(wù)啟動了,那么子任務(wù)將擁有兩個觸發(fā)維度,第一是根據(jù)子任務(wù)自身的調(diào)度類型和調(diào)度速度觸發(fā),第二是調(diào)度中心觸發(fā)

執(zhí)行器側(cè)log

2023-10-10 09:13:00.276 INFO 19228 --- [ Thread-4] com.xxl.job.core.server.EmbedServer : >>>>>>>>>>> xxl-job remoting server start success, nettype = class com.xxl.job.core.server.EmbedServer, port = 9999
2023-10-10 09:13:23.549 INFO 19228 --- [Pool-1699379094] c.xxl.job.core.executor.XxlJobExecutor : >>>>>>>>>>> xxl-job regist JobThread success, jobId:29, handler:com.xxl.job.core.handler.impl.MethodJobHandler@2b43f314[class com.ramble.xxljob.task.DemoJob#jobFather]
2023-10-10 09:13:23.552 DEBUG 19228 --- [9-1696900403549] com.ramble.xxljob.task.DemoJob : do - jobFather - fail
2023-10-10 09:13:28.495 DEBUG 19228 --- [9-1696900403549] com.ramble.xxljob.task.DemoJob : do - jobFather - fail
2023-10-10 09:13:34.500 DEBUG 19228 --- [9-1696900403549] com.ramble.xxljob.task.DemoJob : do - jobFather - success
2023-10-10 09:13:34.511 INFO 19228 --- [Pool-1699379094] c.xxl.job.core.executor.XxlJobExecutor : >>>>>>>>>>> xxl-job regist JobThread success, jobId:30, handler:com.xxl.job.core.handler.impl.MethodJobHandler@7e3d2ebd[class com.ramble.xxljob.task.DemoJob#jobChild]
2023-10-10 09:13:34.512 DEBUG 19228 --- [0-1696900414511] com.ramble.xxljob.task.DemoJob : do - jobChild
2023-10-10 09:13:38.494 DEBUG 19228 --- [9-1696900403549] com.ramble.xxljob.task.DemoJob : do - jobFather - fail
2023-10-10 09:13:43.526 DEBUG 19228 --- [9-1696900403549] com.ramble.xxljob.task.DemoJob : do - jobFather - success
2023-10-10 09:13:43.539 DEBUG 19228 --- [0-1696900414511] com.ramble.xxljob.task.DemoJob : do - jobChild

通過日志可以觀察到:

  • 一開始僅將父任務(wù)的 JobThread注冊到了調(diào)度中心
  • 而后父任務(wù)按照調(diào)度速度執(zhí)行
  • 當(dāng)父任務(wù)執(zhí)行失敗沒有觸發(fā)子任務(wù)執(zhí)行
  • 當(dāng)父任務(wù)執(zhí)行成功首先將子任務(wù)的 JobThread 注冊到了調(diào)度中心,隨即執(zhí)行了子任務(wù)

調(diào)度中心-任務(wù)管理詳解

執(zhí)行器

任務(wù)需要綁定到執(zhí)行器,任務(wù)觸發(fā)調(diào)度時將會自動發(fā)現(xiàn)注冊成功的執(zhí)行器, 實現(xiàn)任務(wù)自動發(fā)現(xiàn)功能; 另一方面也可以方便的進(jìn)行任務(wù)分組。每個任務(wù)必須綁定一個執(zhí)行器, 可在 "執(zhí)行器管理" 進(jìn)行設(shè)置

路由策略

當(dāng)執(zhí)行器集群部署時,提供豐富的路由策略,包括:

  • FIRST(第一個):固定選擇第一個機(jī)器;
  • LAST(最后一個):固定選擇最后一個機(jī)器;
  • ROUND(輪詢);
  • RANDOM(隨機(jī)):隨機(jī)選擇在線的機(jī)器;
  • CONSISTENT_HASH(一致性HASH):每個任務(wù)按照Hash算法固定選擇某一臺機(jī)器,且所有任務(wù)均勻散列在不同機(jī)器上。
  • LEAST_FREQUENTLY_USED(最不經(jīng)常使用):使用頻率最低的機(jī)器優(yōu)先被選舉;
  • LEAST_RECENTLY_USED(最近最久未使用):最久未使用的機(jī)器優(yōu)先被選舉;
  • FAILOVER(故障轉(zhuǎn)移):按照順序依次進(jìn)行心跳檢測,第一個心跳檢測成功的機(jī)器選定為目標(biāo)執(zhí)行器并發(fā)起調(diào)度;
  • BUSYOVER(忙碌轉(zhuǎn)移):按照順序依次進(jìn)行空閑檢測,第一個空閑檢測成功的機(jī)器選定為目標(biāo)執(zhí)行器并發(fā)起調(diào)度;
  • SHARDING_BROADCAST(分片廣播):廣播觸發(fā)對應(yīng)集群中所有機(jī)器執(zhí)行一次任務(wù),同時系統(tǒng)自動傳遞分片參數(shù);可根據(jù)分片參數(shù)開發(fā)分片任務(wù);

調(diào)度過期策略

  • 忽略:調(diào)度過期后,忽略過期的任務(wù),從當(dāng)前時間開始重新計算下次觸發(fā)時間

  • 立即執(zhí)行一次:調(diào)度過期后,立即執(zhí)行一次,并從當(dāng)前時間開始重新計算下次觸發(fā)時間

阻塞處理策略

調(diào)度過于密集執(zhí)行器來不及處理時的處理策略

  • 單機(jī)串行(默認(rèn)):調(diào)度請求進(jìn)入單機(jī)執(zhí)行器后,調(diào)度請求進(jìn)入FIFO隊列并以串行方式運(yùn)行
  • 丟棄后續(xù)調(diào)度:調(diào)度請求進(jìn)入單機(jī)執(zhí)行器后,發(fā)現(xiàn)執(zhí)行器存在運(yùn)行的調(diào)度任務(wù),本次請求將會被丟棄并標(biāo)記為失敗
  • 覆蓋之前調(diào)度:調(diào)度請求進(jìn)入單機(jī)執(zhí)行器后,發(fā)現(xiàn)執(zhí)行器存在運(yùn)行的調(diào)度任務(wù),將會終止運(yùn)行中的調(diào)度任務(wù)并清空隊列,然后運(yùn)行本次調(diào)度任務(wù)

超時和重試

  • 任務(wù)超時時間:支持自定義任務(wù)超時時間,任務(wù)運(yùn)行超時將會主動中斷任務(wù)
  • 失敗重試次數(shù);支持自定義任務(wù)失敗重試次數(shù),當(dāng)任務(wù)失敗時將會按照預(yù)設(shè)的失敗重試次數(shù)主動進(jìn)行重試

到此這篇關(guān)于SpringBoot整合XXLJob的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot整合XXLJob內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • javamail實現(xiàn)注冊激活郵件

    javamail實現(xiàn)注冊激活郵件

    這篇文章主要為大家詳細(xì)介紹了javamail實現(xiàn)注冊激活郵件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • MyBatis連接池、動態(tài) SQL 與多表關(guān)聯(lián)查詢的注意事項

    MyBatis連接池、動態(tài) SQL 與多表關(guān)聯(lián)查詢的注意事項

    本文將從連接池原理出發(fā),深入講解動態(tài) SQL 的常用標(biāo)簽,并通過實例演示一對多、多對多等復(fù)雜關(guān)聯(lián)查詢的實現(xiàn),幫助你掌握 MyBatis 的進(jìn)階用法,感興趣的朋友一起看看吧
    2025-07-07
  • Java多線程之定時器Timer的實現(xiàn)

    Java多線程之定時器Timer的實現(xiàn)

    定時/計劃功能在Java應(yīng)用的各個領(lǐng)域都使用得非常多,比方說Web層面。本文主要為大家介紹了Java多線程中定時器Timer的實現(xiàn),感興趣的小伙伴可以了解一下
    2022-10-10
  • java遍歷讀取整個redis數(shù)據(jù)庫實例

    java遍歷讀取整個redis數(shù)據(jù)庫實例

    這篇文章主要介紹了java遍歷讀取整個redis數(shù)據(jù)庫實例,使用支持正則表達(dá)式的key搜索方法jedis.keys(“*”)實現(xiàn),需要的朋友可以參考下
    2014-05-05
  • Java獲取classpath根路徑的三種方法

    Java獲取classpath根路徑的三種方法

    本文介紹了在Java中獲取classpath根路徑的三種方法:ClassLoader.getResource、Class.getResource和System.getProperty,每種方法都有其適用場景,開發(fā)者可以根據(jù)具體需求選擇合適的方法,需要的朋友可以參考下
    2026-01-01
  • Java基于iText庫實現(xiàn)PDF模板動態(tài)賦值與文檔生成功能

    Java基于iText庫實現(xiàn)PDF模板動態(tài)賦值與文檔生成功能

    在企業(yè)級開發(fā)中,生成標(biāo)準(zhǔn)化的 PDF 文檔是常見需求,與 Word 文檔不同,PDF 以其固定布局和跨平臺顯示一致性的特點(diǎn),更適合作為最終輸出格式,本文將詳細(xì)介紹如何使用 iText 庫實現(xiàn)從 PDF 模板生成新文檔并動態(tài)賦值的功能,需要的朋友可以參考下
    2025-07-07
  • JAVA中反射機(jī)制和模塊化的深入講解

    JAVA中反射機(jī)制和模塊化的深入講解

    很多剛學(xué)Java反射的同學(xué)可能對反射技術(shù)一頭霧水,為什么要學(xué)習(xí)反射,學(xué)習(xí)反射有什么作用,下面這篇文章主要給大家介紹了關(guān)于JAVA中反射機(jī)制和模塊化的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • java實現(xiàn)砸金蛋抽獎功能

    java實現(xiàn)砸金蛋抽獎功能

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)砸金蛋抽獎功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • java構(gòu)建樹形結(jié)構(gòu)的方式及如何組裝樹狀結(jié)構(gòu)數(shù)據(jù)

    java構(gòu)建樹形結(jié)構(gòu)的方式及如何組裝樹狀結(jié)構(gòu)數(shù)據(jù)

    這篇文章主要介紹了在Java中構(gòu)建樹狀數(shù)據(jù)結(jié)構(gòu)的幾種常見方法,包括遞歸、使用Map/HashMap以及基于Stream流的方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • 一文徹底弄懂Java中HashMap的原理

    一文徹底弄懂Java中HashMap的原理

    HashMap是基于Map接口的非同步實現(xiàn),線程不安全,是為了快速存取而設(shè)計的,這篇文章主要介紹了Java中HashMap原理的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-01-01

最新評論

河源市| 望都县| 丹东市| 米脂县| 邯郸市| 会同县| 渝中区| 呈贡县| 美姑县| 乐陵市| 桂阳县| 家居| 池州市| 句容市| 珲春市| 唐山市| 安远县| 河北区| 益阳市| 永胜县| 正蓝旗| 桑植县| 通山县| 吴堡县| 东辽县| 渝北区| 武清区| 梁山县| 宁国市| 遂溪县| 黄陵县| 北辰区| 广德县| 黄陵县| 车致| 含山县| 淳化县| 土默特左旗| 万州区| 比如县| 清原|