首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

Spring Quartz 動態修改定時任務 Cron 表達式

     編輯:C++ 入門

場景

系統啟動時載入默認 Cron 表達式,運行中需根據數據庫配置動態調整觸發時間,不重啟應用。

核心組件

  1. SchedulerFactoryBean:管理調度器,lazy-init="true" 延遲啟動。
  2. CronTriggerBean:綁定 JobDetail,持有 Cron 表達式。
  3. Service 初始化:init-method="setTimingSendTime" 啟動時從 DB 讀取時間並重設觸發器。

關鍵配置

<bean id="timingSendTimerTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="timingSendTimerJob"/>
    <property name="cronExpression" value="1 0 0 1 1 ? 2099"/> <!-- 默認 -->
</bean>

<bean id="setTimingSendTimeServiceImpl" class="...SetTimingSendTimeServiceImpl"
      lazy-init="false" init-method="setTimingSendTime">
    <property name="scheduler" ref="strQuartz"/>
    <property name="workOrderInfoDAO" ref="workOrderInfoDAO"/>
</bean>

動態修改代碼

public void setTimingSendTime() {
    CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger("timingSendTimerTrigger", Scheduler.DEFAULT_GROUP);
    String sendTime = workOrderInfoDAO.queryTimingSendTime(); // 如 "2024-01-01 14:30:00.000"
    if (sendTime == null) return;
    sendTime = sendTime.substring(0, sendTime.lastIndexOf("."));
    String[] parts = sendTime.split(" ")[1].split(":");
    String cron = parts[2] + " " + parts[1] + " " + parts[0] + " * * ?";
    trigger.setCronExpression(cron);
    scheduler.rescheduleJob("timingSendTimerTrigger", Scheduler.DEFAULT_GROUP, trigger);
}

注意事項

  • Cron 表達式格式:秒 分 時 日 月 周 年?
  • rescheduleJob 需要觸發器名稱、組名、新觸發器對象。
  • 數據庫時間格式解析要健壯,建議用 SimpleDateFormat 或 Java 8 DateTimeFormatter。
  • 集群環境下需確保同步(Quartz 集群模式自動處理)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved