Quartz定时任务的使用和配置,全注解和xml

简介

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("计时任务....");
    }
}
原文地址:https://www.cnblogs.com/xiaozhang666/p/13738153.html