首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring Boot 實現動態定時任務:基於 Quartz 的 Cron 表達式運行時修改

     編輯:Java 相關知識

Spring @Scheduled(cron = "...") 雖然簡單,但 Cron 表達式寫死在代碼中,無法滿足「運行時動態調整排程」的需求。本文展示如何結合 Quartz Scheduler,通過 SchedulingConfigurer + Trigger 實現 Cron 表達式的動態更新,並提供 REST API 供外部調用修改。

核心依賴

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.3</version>
</dependency>

配置屬性

cron:
  pattern: "0/1 * * * * ?"  # 預設每秒執行一次

動態任務基類

public class DynamicScheduledTask implements SchedulingConfigurer {
    @Value("${cron.pattern}")
    private String pattern;  // 運行時可變更

    public void setCron(String cron) { this.pattern = cron; }

    @Override
    public void configureTasks(ScheduledTaskRegistrar registrar) {
        registrar.addTriggerTask(
            this::doBiz,  // 執行邏輯
            triggerContext -> {
                // 每次執行前重新解析最新 pattern
                CronTrigger trigger = new CronTrigger(pattern);
                return trigger.nextExecutionTime(triggerContext);
            }
        );
    }

    protected void doBiz() { System.out.println("do biz..."); }
}

關鍵點:Trigger 的 nextExecutionTime 每次調度前都會被調用,此處動態構建 CronTrigger 即可實現熱更新。

啟用排程

@SpringBootApplication
@EnableScheduling
public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }

業務任務實現

@Component
public class UserDynamicJob extends DynamicScheduledTask {
    @Autowired private IUserService userService;
    @Override
    public void doBiz() {
        try {
            User user = userService.selectOne(new HashMap<>());
            System.out.println("Dynamic job exec: " + user);
        } catch (DataNotFoundException e) { e.printStackTrace(); }
    }
}

動態修改 API

驗證效果

  1. 啟動應用,控制台每秒輸出 do biz...
  2. 調用 POST /api/cron?cron=0/10 * * * * ?
  3. 觀察控制台輸出頻率變為每 10 秒一次,無需重啟應用

進階建議

  • 將 Cron 表達式持久化到數據庫/配置中心,應用啟動時加載
  • 增加參數校驗,防止非法 Cron 導致任務停止
  • 結合 Quartz 的 JobDetail/Trigger API 實現任務暫停/恢復/刪除
  • 分佈式環境下需加入分佈式鎖,防止多節點重複執行

此方案輕量、無侵入,適合中小型專案快速接入動態排程需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved