一、前提
本文实现前提是已经实现一个SSM的环境,可参考:搭建SSM框架
二、目录结构
三、pom.xml
引入quartz的jar包
<!-- quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
四、spring-config.xml
在spring的配置文件中引入quartz的配置文件,使得quartz中的bean给spring管理
<!-- 引入quartz定时任务的配置文件 -->
<import resource="quartz-*.xml"/>
五、四种情况
quartz中包含两种触发器Trigger以及两种任务JobDetail。
两种触发器为:SimpleTriggerFactoryBean简单触发器,指定定时任务的开始时间以及间隔时间。CronTriggerFactoryBean为cron表达式触发器,通过cron表达式的方式指定定时任务执行的具体年月日时分秒。
两种JobDetail:MethodInvokingJobDetailFactoryBean指定定时任务的执行类与执行方法,通过反射来实现定时任务的调度。JobDetailFactoryBean没有指定定时任务的执行方法,只指定了定时任务的实现类,因此需要实现类继承QuartzJobBean抽象类来实现默认方法,或实现Job接口实现默认方法。定时任务调度时执行默认方法中的实现即可。
需要注意的是,在低版本的quartz中,也就是比较老的java项目中,触发器Trigger和JobDetail可能没有中间的Factory这个单词,说明在低版本的quartz没有使用工厂模式,在高版本中进行了优化。因此当低版本的quartz参考如下案例会导致报错。
以下为他们两两结合组成的四种实现情况。
1、MethodInvokingJobDetail…与CronTrigger…的实现
(1)定时任务类
package com.ykq.task;
/**
* @author: kqyin
* @date: 2021/11/23 10:03
* @Description: 通过方法反射方式,使用cron表达式的定时任务
*/
public class MethodInvokeCronTask {
public void execute(){
System.out.println("1.MethodInvokeCronTask demo start ...");
}
}
(2)配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 任务1配置 -->
<bean name="methodInvokeCronTask" class="com.ykq.task.MethodInvokeCronTask"/>
<bean id="methodInvokeCronJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 执行的类 -->
<property name="targetObject">
<ref bean="methodInvokeCronTask" />
</property>
<!-- 类中的方法 -->
<property name="targetMethod">
<value>execute</value>
</property>
</bean>
<bean id="methodInvokeCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="methodInvokeCronJobDetail" />
</property>
<!-- 每一秒钟执行一次 -->
<property name="cronExpression">
<value>0/1 * * * * ?</value>
</property>
</bean>
<!-- 总配置 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!-- 添加触发器 -->
<property name="triggers">
<list>
<ref bean="methodInvokeCronTrigger" />
</list>
</property>
</bean>
</beans>
2、MethodInvokingJobDetail…与SimpleTrigger…的实现
(1)定时任务类
package com.ykq.task;
/**
* @author: kqyin
* @date: 2021/11/23 10:17
* @Description: 通过方法反射方式,使用SimpleTrigger的定时任务
*/
public class MethodInvokeSimpleTask {
public void execute(){
System.out.println("2.MethodInvokeSimpleTask demo start ...");
}
}
(2)配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 任务2配置 -->
<bean name="methodInvokeSimpleTask" class="com.ykq.task.MethodInvokeSimpleTask"/>
<bean id="methodInvokeSimpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 执行的类 -->
<property name="targetObject">
<ref bean="methodInvokeSimpleTask" />
</property>
<!-- 类中的方法 -->
<property name="targetMethod">
<value>execute</value>
</property>
</bean>
<bean id="methodInvokeSimpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail">
<ref bean="methodInvokeSimpleJobDetail" />
</property>
<property name="startDelay" value="5000"/>
<property name="repeatInterval" value="5000"/>
</bean>
<!-- 总配置 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!-- 添加触发器 -->
<property name="triggers">
<list>
<ref bean="methodInvokeSimpleTrigger" />
</list>
</property>
</bean>
</beans>
3、JobDetail…与CronTrigger…的实现
(1)定时任务类
package com.ykq.task;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
/**
* @author: kqyin
* @date: 2021/11/23 10:28
* @Description: 无方法反射,使用cron表达式的定时任务
*/
public class NoMethodInvokeCronTask extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("3.NoMethodInvokeCronTask demo start ...");
}
}
(2)配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 任务3配置 -->
<bean id="noMethodInvokeCronJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<!-- 执行的类 -->
<property name="jobClass" value="com.ykq.task.NoMethodInvokeCronTask"/>
</bean>
<bean id="noMethodInvokeCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="noMethodInvokeCronJobDetail" />
</property>
<!-- 每一秒钟执行一次 -->
<property name="cronExpression">
<value>0/1 * * * * ?</value>
</property>
</bean>
<!-- 总配置 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!-- 添加触发器 -->
<property name="triggers">
<list>
<ref bean="noMethodInvokeCronTrigger" />
</list>
</property>
</bean>
</beans>
4、JobDetail…与SimpleTrigger…实现
(1)定时任务类
package com.ykq.task;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
/**
* @author: kqyin
* @date: 2021/11/23 10:28
* @Description: 无方法反射,使用SimpleTrigger的定时任务
*/
public class NoMethodInvokeSimpleTask extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("4.NoMethodInvokeSimpleTask demo start ...");
}
}
(2)配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 任务4配置 -->
<bean id="noMethodInvokeSimpleJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<!-- 执行的类 -->
<property name="jobClass" value="com.ykq.task.NoMethodInvokeSimpleTask"/>
</bean>
<bean id="noMethodInvokeSimpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail">
<ref bean="noMethodInvokeSimpleJobDetail" />
</property>
<property name="startDelay" value="5000"/>
<property name="repeatInterval" value="5000"/>
</bean>
<!-- 总配置 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!-- 添加触发器 -->
<property name="triggers">
<list>
<ref bean="noMethodInvokeSimpleTrigger" />
</list>
</property>
</bean>
</beans>