上一篇介绍了@Scheduled注解的使用,接下来我们说一下Quartz的使用
一般在项目中,除非定时任务涉及到的业务实在是太简单,使用 @Scheduled 注解来解决定时任务,否则大部分情况可能都是使用 Quartz 来做定时任务。在 Spring Boot 中使用 Quartz ,只需要在创建项目时,添加 Quartz 依赖即可:

项目创建完成后,还需要添加定时任务的注解
Quartz 在使用过程中,有两个关键概念,一个是JobDetail(要做的事情),另一个是触发器(什么时候做),要定义 JobDetail,需要先定义 Job,Job 的定义有两种方式:
第一种方式,直接定义一个Bean:
- package com.example.job;
-
- import org.springframework.stereotype.Component;
-
- import java.util.Date;
-
-
- @Component
- public class MyJob1 {
- public void sayHello(){
- System.out.println("MyJob1>>>"+new Date());
- }
- }
关于这种方式说两点:
1.首先将这个Job注册到Spring容器中.
2.这种定义方式有一个缺陷,就是无法传参
第二种定义方式,则是继承 QuartzJobBean 并实现默认的方法:
- package com.example.job;
-
- import com.example.service.HelloService;
- import org.quartz.JobExecutionContext;
- import org.quartz.JobExecutionException;
- import org.springframework.scheduling.quartz.QuartzJobBean;
-
- public class MyJob2 extends QuartzJobBean {
- HelloService helloService;
-
- public HelloService getHelloService(){
- return helloService;
- }
-
- public void setHelloService(HelloService helloService){
- this.helloService = helloService;
- }
-
- @Override
- protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
- helloService.sayHello();
- }
- }
和第一种方式相比,这种方式支持传参没任务启动时,executeInternal方法将会执行.
Job 有了之后,接下来我们创建类,配置 JobDetail 和 Trigger 触发器,内容如下:
- package com.example.config;
-
- import com.example.job.MyJob2;
- import com.example.service.HelloService;
- import org.quartz.JobDataMap;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.scheduling.quartz.*;
-
- import java.util.Date;
-
- @Configuration
- public class QuartzConfig {
- @Bean
- MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean() {
- MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean();
- bean.setTargetBeanName("myJob1");
- bean.setTargetMethod("sayHello");
- return bean;
- }
- @Bean
- JobDetailFactoryBean jobDetailFactoryBean() {
- JobDetailFactoryBean bean = new JobDetailFactoryBean();
- bean.setJobClass(MyJob2.class);
- JobDataMap map = new JobDataMap();
- map.put("helloService", helloService());
- bean.setJobDataMap(map);
- return bean;
- }
- @Bean
- SimpleTriggerFactoryBean simpleTriggerFactoryBean() {
- SimpleTriggerFactoryBean bean = new SimpleTriggerFactoryBean();
- bean.setStartTime(new Date());
- bean.setRepeatCount(5);
- bean.setJobDetail(methodInvokingJobDetailFactoryBean().getObject());
- bean.setRepeatInterval(3000);
- return bean;
- }
- @Bean
- CronTriggerFactoryBean cronTrigger() {
- CronTriggerFactoryBean bean = new CronTriggerFactoryBean();
- bean.setCronExpression("0/30 * * * * ?");
- bean.setJobDetail(jobDetailFactoryBean().getObject());
- return bean;
- }
- @Bean
- SchedulerFactoryBean schedulerFactoryBean() {
- SchedulerFactoryBean bean = new SchedulerFactoryBean();
- bean.setTriggers(cronTrigger().getObject(), simpleTriggerFactoryBean().getObject());
- return bean;
- }
- @Bean
- HelloService helloService() {
- return new HelloService();
- }
- }
关于这个配置说如下几点:
1. JobDetail 的配置有两种方式:MethodInvokingJobDetailFactoryBean 和 JobDetailFactoryBean 。
2. 使用 MethodInvokingJobDetailFactoryBean 可以配置目标 Bean 的名字和目标方法的名字,这种方式不支持传参。
3. 使用 JobDetailFactoryBean 可以配置 JobDetail ,任务类继承自 QuartzJobBean ,这种方式支持传参,将参数封装在 JobDataMap 中进行传递。
4. Trigger 是指触发器,Quartz 中定义了多个触发器,这里向大家展示其中两种的用法,SimpleTrigger 和 CronTrigger 。
5. SimpleTrigger 有点类似于前面说的 @Scheduled 的基本用法。
6. CronTrigger 则有点类似于 @Scheduled 中 cron 表达式的用法。
全部执行完毕之后,启动Spring Boot项目就可以看到定时任务的执行了

以上内容就是关于定时任务的几个用法,希望可以帮助到大家