前言, 该篇SSM整合Quartz,需要做的配置是:
1.配置任务调度工厂
2.配置任务调度触发器
3.配置任务调度实现方法类(包括Cron表达式、是否允许并发等)
导入核心依赖(其余的spring-context/spring-mvc等那些就不做展列了):
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency>
首先是配置XML文件,我是单独创建了一个spring-quartz-context.xml:
<?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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd "> <!-- ======================== 调度工厂 ======================== --> <bean id="quartzFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="CronTriggerBean"/> </list> </property> </bean> <!-- ======================== 调度触发器 ======================== --> <bean id="CronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="SpringQtzJobMethod"/> <!--每天18点执行一次:0 0 18 * * ?--> <property name="cronExpression" value="*/5 * * * * ?"/> </bean> <!-- ======================== 调度任务 ======================== --> <!-- 定义目标bean和bean中的方法 --> <bean id="SpringQtzJob" class="com.zqgame.qp.quartzJob.QuartzTask"/> <!-- 使用MethodInvokingJobDetailFactoryBean,任务类可以不实现Job接口,通过targetMethod指定调用方法 --> <bean id="SpringQtzJobMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!--定时任务的方法类--> <property name="targetObject" ref="SpringQtzJob"/> <!--定时任务方法的名称--> <property name="targetMethod" value="execute"/> <!-- 不允许并发 需等待上次执行结束--> <!-- <property name="concurrent" value="false"/>--> </bean> </beans>
然后是任务调度方法的类QuartzTask.java:
import java.util.Date; import static java.lang.Thread.sleep; /** * @Author : JCccc * @CreateTime : 2019/8/7 * @Description : **/ public class QuartzTask { private static int COUNT_NUM = 0; public void execute() throws InterruptedException { long ms = System.currentTimeMillis(); System.out.println("\t\t" + new Date(ms)); System.out.println("(" + COUNT_NUM++ + ")"); // sleep(10000); // System.out.println("当前的COUNT_NUM是:"+COUNT_NUM); } }
OK,把项目跑起来,看看效果,每5秒执行一次很正确:
那么到此其实已经结束,但是如果你看了上面的代码,你可以看到xml配置里面有一个是否允许并发(屏蔽代表允许),然后调度任务的方法类里面也屏蔽了2行代码。
接下来我们把QuartzTask.java里面的2行代码打开注释,然而xml里面依然是允许并发(注释状态)
sleep(10000); System.out.println("当前的COUNT_NUM是:"+COUNT_NUM);
接下来再把项目跑起来,看看效果,如下(可以看到明显已经乱了,因为每次任务执行时间长过了间隔,而我们是允许并发的情形,即不需要等上一个任务执行完再执行下一个任务,所以就乱了):
所以,我建议一般情况,调度任务每一次是有关联的,设置不允许并发: