系統啟動時載入默認 Cron 表達式,運行中需根據數據庫配置動態調整觸發時間,不重啟應用。
lazy-init="true" 延遲啟動。JobDetail,持有 Cron 表達式。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);
}
秒 分 時 日 月 周 年?rescheduleJob 需要觸發器名稱、組名、新觸發器對象。SimpleDateFormat 或 Java 8 DateTimeFormatter。