• 使用spring中自带的定时执行器
- 开启定时器 在启动类上当然也可以在其他地方,要保证能注入到ioc容器中
@SpringBootApplication
@EnableScheduling//开启定时器
public class HisApplication {

    public static void main(String[] args) {
        SpringApplication.run(HisApplication.class, args);
    }

}
- 开始自定义任务逻辑使用@Scheduled注在方法上,类上可以使用@Configuration
/**创建定时器任务
 * */
@Configuration//主要是用于标记是一个配置类,兼备component的效果
public class TaskJop  {
    /**@Scheduled是开启一个定时器任务
     *  fixedRate 表示任务之间的时间间隔开始时间的间隔
     *  fixedDelay 是任务执行之间的时间间隔 本次任务结束到下次任务开始
     * joptest类是任务
     * Scheduled是调度 cron是调度条件
     * */
    @Scheduled(cron = "0/5 * * * * *")
    private void joptest(){
        System.err.println("执行定时器任务"+ LocalDateTime.now());
    }
}
  • 使用quartz做任务调度器
- 导入依赖
		<!--定时器依赖-->
        <!--quartz定时调度依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>
 - 创建任务和调用
/** 定义一个任务 quartzJob类
 - 实现任务调度的接口 可以被调用
 -  - */
@Configuration
public class QuartzJob implements SchedulingConfigurer {

    /**设置任务和调用器
     * */
    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        scheduledTaskRegistrar.addTriggerTask(
                ()->System.err.println(LocalDateTime.now()+"哈哈"),
                triggerContext -> {
                    return new CronTrigger("0/8 * * * * * ")
                            .nextExecutionTime(triggerContext);
                });

    }
} 
 - addTriggerTask是任务
 - triggerContext是调度时间
  • 实现springboot定时任务
    1 使用Scheduled定时器
    2 整合Quartz定时器任务框架
  • 使用Scheduled定时器
- 添加坐标
<!--添加Scheduled坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.3.14.RELEASE</version>
        </dependency>
- 编写任务类
/**Scheduled定时任务
 * 该类不属于任何层使用@Component来标识
 *
 * */
@Component
public class ScheduledDemo {
    /** 定时任务方法
     * @Scheduled:设置定时任务 将一个方法设置成一个可以执行的任务
     * 在这注解中通过一个cron属性来设置触发时间
     * cron是一个表达式 就是触发任务时间的字符串
     *
     * */
    @Scheduled(cron = "0/5 * * * * ?")
    public void scheduledMethod(){
        System.err.println("定时器触发了scheduled");
    }
}
- 开启定时器在启动类上
@SpringBootApplication
@EnableScheduling
public class DemoApplication {
  • cron表达式
- cron是一个字符串 用于表示时间的 分为6个或是7个域
- 时间位置格式是 秒 分钟 小时 天 月 周 [年] 
s 秒 0-59 
min 分钟 0-59
h 小时 0-23
d 天 1-31
M 月 1-12 
y 年 可选 1970-2099
星期 1-7 1是周日 
特殊符号含义:
* 可以用在所有字段中 表示任意时间
?无意义的占位符 通常用在星期的字段中
- 在两个值范围之内
/ 间隔
  • springboot整合quartz定时任务框架
  • 块日子
  • 名称解释
    1 job 任务 你要做什么事情
    2 Trigger 触发器 你什么时候去做
    3 Scheduler 任务调度 你什么时候去做什么事情
  • 实例
- 添加依赖
<!--添加Scheduled坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.3.14.RELEASE</version>
        </dependency>
        <!--quartz-->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.1</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.2.12.RELEASE</version>
        </dependency>

-创建任务类job
/** job类
 * */
public class QuartzDemo implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.err.println("quartz框架"+ LocalTime.now());
    }
}
-创建一个对quartz框架配置的配置类
** Quartz 配置类
 * 第一步配置 job任务对象
 * 第二步 配置Trigger 触发器对象
 * 第三步实现任务调度 Scheduler
 * */
@Configuration
public class QuartzConfig {
    //创建实例化出JobDetailFactoryBean对象
    @Bean
    public JobDetailFactoryBean jobDetailFactoryBean(){
        JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();
        //将编写的任务类设置到这个任务工厂中,这就是为什么编写的任务类没有进行依赖注入
        jobDetailFactoryBean.setJobClass(QuartzDemo.class);
        return jobDetailFactoryBean;
    }
    //配置Trigger对象 就是你什么时候执行触发, 也就是触发的条件是什么
    //方法参数是将实例化出的任务对象
    @Bean
    public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){
        CronTriggerFactoryBean cronBean = new CronTriggerFactoryBean();
        //将任务类实例化和触发器进行绑定
        cronBean.setJobDetail(jobDetailFactoryBean.getObject());
        //设置触发时间
        cronBean.setCronExpression("0/5 * * * * ?");
        return cronBean;
    }

    //配置创建Scheduler对象 就是该怎么执行执行什么事情
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean cronTriggerFactoryBean){
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        //将设置好的触发器本scheduler对象进行绑定
        schedulerFactoryBean.setTriggers(cronTriggerFactoryBean.getObject());
        return schedulerFactoryBean;
    }

}
- 启动类记得加上@EnableScheduling

— java定时器

- quartz 
定时器分为三个角色 任务 执行器 调度器 
任务来将任务交给调度器 调度器来通过执行器来执行