簡介
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("計時任務...."); } }