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

Spring Quartz 動態排程實作指南(一):從前端配置到 Cron 表達式持久化

     編輯:Java 相關知識

前言

在企業級應用中,定時任務的排程需求往往不固定,使用者可能需要根據業務情況動態調整執行頻率。本文以 Struts + Spring + Hibernate 架構為例,完整示範如何在前端頁面讓使用者設定排程規則,將其轉換為 Unix Cron Expression 並持久化至資料庫,最後動態更新 Quartz 觸發器,實現真正的「動態排程」。

核心實作步驟

  1. 前端頁面提供直觀的排程規則選擇介面(每月、每週、自訂)。
  2. 將使用者選擇的規則轉換為標準的 Cron Expression。
  3. 將 Cron Expression 存入資料庫(或 XML 檔案),作為持久化設定。
  4. 應用啟動或設定變更時,從資料庫讀取表達式。
  5. 更新對應 Job 的 Trigger 時間設定。
  6. 呼叫 rescheduleJob() 使新排程生效。

前端頁面設計:三種排程規則

根據業務需求,提供三種常見的排程類型,並搭配 JavaScript 動態顯示/隱藏對應的設定欄位:

1. 排程類型單選群

<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>

2. 每月排程:指定「第幾週的星期幾」

<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>

3. 每週排程:僅選擇星期幾

<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>

4. 自訂排程:直接輸入具體日期(如 2007-01-10)

三種規則共用同一組「起始時間」設定,包含上午/下午、時、分、秒:

<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 集群環境下的同步策略。

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