在企業級 Java 應用開發中,定時任務是常見需求。本文詳細介紹如何使用 Spring 框架整合 Quartz 調度器實現定時任務,包含完整的代碼示例、配置說明及 Cron 表達式參考。
首先創建一個執行具體業務邏輯的任務類:
import org.apache.log4j.Logger;
public class TaskJob {
private static final Logger log = Logger.getLogger(TaskJob.class);
public void sayHello() {
try {
log.info("處理任務開始...");
// 業務邏輯代碼調用
System.out.println("時間[" + new java.util.Date().toLocaleString() + "]----->大家好啊!");
log.info("處理任務結束!");
} catch (Exception e) {
log.error("處理任務出現異常", e);
}
}
}
在 Spring 配置文件中定義任務 Bean、JobDetail、觸發器及調度器:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "https://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 1. 定義任務 Bean -->
<bean name="taskJob" class="util.TaskJob" />
<!-- 2. 使用 MethodInvokingJobDetailFactoryBean 包裝目標方法 -->
<bean id="methodInvokingJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="taskJob" />
</property>
<property name="targetMethod">
<value>sayHello</value>
</property>
</bean>
<!-- 3. 配置 Cron 觸發器 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="methodInvokingJobDetail" />
</property>
<!-- 每天 08:00 到 21:00 每分鐘觸發 -->
<property name="cronExpression">
<value>0 * 08-21 * * ?</value>
</property>
</bean>
<!-- 4. 配置調度器工廠 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="cronTrigger" />
</list>
</property>
</bean>
</beans>
獨立應用測試:
package util;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestApp {
public static void main(String[] args) {
System.out.println("加載 Spring 配置文件....");
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println("加載配置文件完畢!");
}
}
Web 專案部署需在 web.xml 中添加:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</context-param>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
| 字段 | 允許值 | 允許特殊字符 |
|---|---|---|
| 秒 | 0-59 | , - * / |
| 分 | 0-59 | , - * / |
| 小時 | 0-23 | , - * / |
| 日期 | 1-31 | , - * ? / L W C |
| 月份 | 1-12 或 JAN-DEC | , - * / |
| 星期 | 1-7 或 SUN-SAT | , - * ? / L C # |
| 年(可選) | 留空, 1970-2099 | , - * / |
0 0 12 * * ? - 每天中午 12 點觸發0 15 10 ? * * - 每天上午 10:15 觸發0 * 14 * * ? - 每天下午 2 點到 2:59 每分鐘觸發0 0/5 14 * * ? - 每天下午 2 點到 2:55 每 5 分鐘觸發0 15 10 ? * MON-FRI - 週一至週五上午 10:15 觸發0 15 10 15 * ? - 每月 15 號上午 10:15 觸發0 15 10 L * ? - 每月最後一天上午 10:15 觸發0 15 10 ? * 6L - 每月最後一個週五上午 10:15 觸發0 15 10 ? * 6#3 - 每月第三個週五上午 10:15 觸發掌握這套配置後,即可在 Spring 應用中靈活實現各類定時任務需求,如數據備份、報表生成、郵件發送等定時業務處理。