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("计时任务....");
        }
    }
  • 相关阅读:
    leetcode 155. Min Stack 、232. Implement Queue using Stacks 、225. Implement Stack using Queues
    leetcode 557. Reverse Words in a String III 、151. Reverse Words in a String
    leetcode 153. Find Minimum in Rotated Sorted Array 、154. Find Minimum in Rotated Sorted Array II 、33. Search in Rotated Sorted Array 、81. Search in Rotated Sorted Array II 、704. Binary Search
    leetcode 344. Reverse String 、541. Reverse String II 、796. Rotate String
    leetcode 162. Find Peak Element
    leetcode 88. Merge Sorted Array
    leetcode 74. Search a 2D Matrix 、240. Search a 2D Matrix II
    Android的API版本和名称对应关系
    spring 定时任务执行两次解决办法
    解析字符串为泛型的方法
  • 原文地址:https://www.cnblogs.com/xiaozhang666/p/13738153.html
Copyright © 2011-2022 走看看