在实际开发中,定时器使我们很多开发场景中必不可少的。比如我们需要每隔一个时间段执行一次操作。java自带的定时任务局限性太大。有了Quartz定时器用起来会方便很多。
下面配置定时器(单任务定时器)后面有时间我会把多任务的配置教程也写出来。
添加maven依赖:

<!--定时器依赖-->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.1</version>
        </dependency>
<!-- 该依赖必加,里面有sping对schedule的支持 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>
 <!--必须添加,要不然会出错,项目无法启动-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>4.3.16.RELEASE</version>
        </dependency>

接下来只需要再建立两个类就可以:
由于springboot是无xml配置,所以此处我们采用bean注解的方式实现quartz的配置(其实配置yml也是可以的,博主没有试。)
任务执行类(任务执行,并且通过控制器的接口实现时间间隔的动态修改
任务类):

/*
    *这几个注解必须要有!
    */ 
    @Configuration
    @Component
    @EnableScheduling
    public class TimingTask {
        public void start() throws InterruptedException {
            System.err.println("定时任务开始执行。"+new Date());

        }
    }

Quartz的详细配置类:

@Configuration
    public class QuartzConfigration {
        @Bean(name = "jobDetail")
        public MethodInvokingJobDetailFactoryBean detailFactoryBean(TimingTask task) {
            // ScheduleTask为需要执行的任务
            MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
            /*
             *  是否并发执行
             *  例如每3s执行一次任务,但是当前任务还没有执行完,就已经过了3s了.
             *  如果此处为true,则下一个任务会bing执行,如果此处为false,则下一个任务会等待上一个任务执行完后,再开始执行
             */
            jobDetail.setConcurrent(true);
            jobDetail.setName("scheduler");// 设置任务的名字
            jobDetail.setGroup("scheduler_group");// 设置任务的分组,这些属性都可以存储在数据库中,在多任务的时候使用

            /*
             * 这两行代码表示执行task对象中的scheduleTest方法。定时执行的逻辑都在scheduleTest。
             */
            jobDetail.setTargetObject(task);
            jobDetail.setTargetMethod("start");
            return jobDetail;
        }

        @Bean(name = "jobTrigger")
        public CronTriggerFactoryBean cronJobTrigger(MethodInvokingJobDetailFactoryBean jobDetail) {
            CronTriggerFactoryBean tigger = new CronTriggerFactoryBean();
            tigger.setJobDetail(jobDetail.getObject());
            tigger.setCronExpression("*/5 * * * * ?");//每五秒执行一次
            tigger.setName("myTigger");// trigger的name
            return tigger;
        }
        @Bean(name = "scheduler")
        public SchedulerFactoryBean schedulerFactory(Trigger cronJobTrigger) {
            SchedulerFactoryBean bean = new SchedulerFactoryBean();
            //设置是否任意一个已定义的Job会覆盖现在的Job。默认为false,即已定义的Job不会覆盖现有的Job。
            bean.setOverwriteExistingJobs(true);
            // 延时启动,应用启动5秒后  ,定时器才开始启动
            bean.setStartupDelay(5);
            // 注册定时触发器
            bean.setTriggers(cronJobTrigger);
            return bean;
        }
        //多任务时的Scheduler,动态设置Trigger。一个SchedulerFactoryBean可能会有多个Trigger
        @Bean(name = "multitaskScheduler")
        public SchedulerFactoryBean schedulerFactoryBean(){
            SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
            return schedulerFactoryBean;
         }
        }

到此为止简单的定时器就实现了

定时任务开始执行。2019-7-13 16:05:55
定时任务开始执行。2019-7-13 16:06:00
定时任务开始执行。2019-7-13 16:06:05
定时任务开始执行。2019-7-13 16:06:10
定时任务开始执行。2019-7-13 16:06:15

最后说一下定时任务的基本语法规则:

<pre>`"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发