简介
Quartz是Job scheduling(作业调度)领域的一个开源项目,Quartz既可以单独使用也可以跟spring框架整合使用,在实际开发中一般会使用后者。使用Quartz可以开发一个或者多个定时任务,每个定时任务可以单独指定执行的时间,例如每隔1小时执行一次、每个月第一天上午10点执行一次、每个月最后一天下午5点执行一次等。
官网:http://www.quartz-scheduler.org/
maven坐标:
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>5.0.5.RELEASE</version> </dependency>
xml配置
创建一个工作类
public class ClearImageJob { /** * 定义清理图片的任务 */ public void clearImageJob(){ System.out.println("clearImageJob......"); } }
主要配置的内容有
配置自定义Job、任务描述、触发器、调度工厂等
-
-
注册任务对象
-
注册JobDetail
-
触发器
-
调度工厂
<!--自动扫包,后续注入jedis到任务调度类--> <context:component-scan base-package="com.itheima.health"/> <!--注册一个定义任务对象--> <bean id = "clearImgJob" class="com.itheima.health.jobs.ClearImageJob"/> <!-- 注册JobDetail,作用是负责通过反射调用指定的Job --> <bean id="clearImgJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!--注入对象--> <property name="targetObject" ref="clearImgJob"/> <!--注入方法--> <property name="targetMethod" value="clearImageJob"/> </bean> <!--注册一个触发器,指定任务触发的时间(间隔)--> <bean id="jobTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="clearImgJobDetail"/> <property name="cronExpression"> <!-- 每隔10秒执行一次任务 0/10 * * * * ? --> <!-- 每隔2分钟执行一次任务 0 0/2 * * * ? --> <!-- 每天凌晨2点执行一次任务 0 0 2 * * ? --> <value>0/10 * * * * ?</value> </property> </bean> <!--注册一个统一调用工厂,通过这个调度工厂调度任务--> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="jobTrigger"/> </list> </property> </bean>
全注解(1)对应xml配置写一一注入就ok
工作类
public class ClearImageJob { /** * 定义清理图片的任务 */ public void clearImagesJob(){ System.out.println("clearImageJob......"); } }
@Configuration public class QuartzConfig { //<!--注册一个定义任务对象--> @Bean public ClearImageJob clearImageJob() { ClearImageJob clearImageJob = new ClearImageJob(); return clearImageJob; } //<!-- 注册JobDetail,作用是负责通过反射调用指定的Job --> @Bean public MethodInvokingJobDetailFactoryBean clearImgJobDetail(ClearImageJob clearImageJob) { MethodInvokingJobDetailFactoryBean clearImgJobDetail = new MethodInvokingJobDetailFactoryBean(); clearImgJobDetail.setTargetObject(clearImageJob); clearImgJobDetail.setTargetMethod("clearImagesJob"); return clearImgJobDetail; } @Bean public CronTriggerFactoryBean cronTriggerFactoryBean(MethodInvokingJobDetailFactoryBean clearImgJobDetail) { CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean(); cronTriggerFactoryBean.setJobDetail(clearImgJobDetail.getObject()); // <!-- 每隔10秒执行一次任务 0/10 * * * * ? --> // <!-- 每隔2分钟执行一次任务 0 0/2 * * * ? --> // <!-- 每天凌晨2点执行一次任务 0 0 2 * * ? --> // <value>0/10 * * * * ?</value> cronTriggerFactoryBean.setCronExpression("0/10 * * * * ?"); return cronTriggerFactoryBean; } @Bean public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean cronTriggerFactoryBean){ SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); schedulerFactoryBean.setTriggers(cronTriggerFactoryBean.getObject()); return schedulerFactoryBean; } }
按照xml顺序配置下来测试没问题。
全注解配置(2),推荐用法,非常简洁
首先有一个配置类
@Configuration @EnableScheduling @ComponentScan("cn.zys.quartzs") public class TestQAnnoConfig { }
@EnableScheduling 开启定时任务功能
然后扫描定时任务所在包
使用定时任务
@Component public class TestQAnno { // @Scheduled(cron = "*/5 * * * * SUN-MON") @Scheduled(cron = "0/10 * * * * ?") public void test() { System.out.println("计时任务...."); } }