zoukankan      html  css  js  c++  java
  • 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("计时任务....");
        }
    }
  • 相关阅读:
    BZOJ3391: [Usaco2004 Dec]Tree Cutting网络破坏
    python总结二
    python总结一
    评论详解
    C++入门篇十三
    C++入门篇十二
    C++入门篇十一
    C++入门篇十
    C++入门篇九
    c++入门篇八
  • 原文地址:https://www.cnblogs.com/xiaozhang666/p/13738153.html
Copyright © 2011-2022 走看看