在企業級應用中,定時任務的排程需求往往不固定,使用者可能需要根據業務情況動態調整執行頻率。本文以 Struts + Spring + Hibernate 架構為例,完整示範如何在前端頁面讓使用者設定排程規則,將其轉換為 Unix Cron Expression 並持久化至資料庫,最後動態更新 Quartz 觸發器,實現真正的「動態排程」。
rescheduleJob() 使新排程生效。根據業務需求,提供三種常見的排程類型,並搭配 JavaScript 動態顯示/隱藏對應的設定欄位:
<tr>
<th>執行這個任務</th>
<td style="font-weight:bold;">
<html:radio property="everyWhat" styleClass="InputBorderNone" value="monthly" onclick="changeStatus(this.value)"> 每月 </html:radio>
<html:radio property="everyWhat" styleClass="InputBorderNone" value="weekly" onclick="changeStatus(this.value)"> 每週 </html:radio>
<html:radio property="everyWhat" styleClass="InputBorderNone" value="userDefined" onclick="changeStatus(this.value)"> 自訂 </html:radio>
<html:hidden property="jobName" value="compare" />
</td>
</tr>
<tr style="display:" id="whichWeek">
<th>選擇第幾個星期</th>
<td style="font-weight:bold;">
<html:select property="week">
<html:option value="1">一</html:option>
<html:option value="2">二</html:option>
<html:option value="3">三</html:option>
<html:option value="4">四</html:option>
</html:select>
<html:select property="dayOfMonth">
<html:option value="1">星期日</html:option>
<html:option value="2">星期一</html:option>
<html:option value="3">星期二</html:option>
<html:option value="4">星期三</html:option>
<html:option value="5">星期四</html:option>
<html:option value="6">星期五</html:option>
<html:option value="7">星期六</html:option>
</html:select>
</td>
</tr>
<tr style="display:none" id="whichDay">
<th>選擇星期</th>
<td style="font-weight:bold;">
<html:select property="dayOfWeek">
<html:option value="1">星期日</html:option>
<html:option value="2">星期一</html:option>
<html:option value="3">星期二</html:option>
<html:option value="4">星期三</html:option>
<html:option value="5">星期四</html:option>
<html:option value="6">星期五</html:option>
<html:option value="7">星期六</html:option>
</html:select>
</td>
</tr>
三種規則共用同一組「起始時間」設定,包含上午/下午、時、分、秒:
<tr>
<th>起始時間</th>
<td style="font-weight:bold;">
<html:select property="timeType" styleId="type" onchange="changeStatus2(this.value)">
<html:option value="AM">上午</html:option>
<html:option value="PM">下午</html:option>
</html:select>
<html:select property="hour" styleId="amHours">
<html:option value="1">1</html:option> ... <html:option value="12">12</html:option>
</html:select>
<html:select property="hour" styleId="pmHours" style="display:none">
<html:option value="13">13</html:option> ... <html:option value="0">0</html:option>
</html:select> 點
<html:text property="minute" name="minute" style="width:20px;" value="0" onchange="valTime(this.value)" /> 分
<html:text property="second" name="second" style="width:20px;" value="0" onchange="valTime(this.value)" /> 秒(0-59之間的整數)
</td>
</tr>
前端表單提交後,Action 層將收集的參數組合成 Cron Expression(例如:0 30 10 ? * MON-FRI),透過 Hibernate 持久化至資料表。排程服務啟動時,讀取該表達式並以 CronTrigger 更新對應的 JobDetail,最後呼叫 Scheduler.rescheduleJob(triggerKey, newTrigger) 完成熱更新,無需重啟應用。
本文詳細展示了從前端交互設計到後端動態重排程的完整鏈路。下一篇將深入探討 Cron 表達式的生成邏輯、資料表結構設計以及 Quartz 集群環境下的同步策略。