Spring Boot定时任务

    xiaoxiao2023-11-04  165

    Scheduled 定时任务器整合 Quartz 定时任务框架   一、Scheduled 定时任务器   Scheduled 定时任务器:是 Spring3.0 以后自带的一个定时任务器。   1、在 pom 文件中添加 Scheduled 的坐标 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.qs</groupId> <artifactId>springbootscheduled</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--添加Scheduled坐标--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency> </dependencies> </project>

      2、编写定时任务类

    @Component public class ScheduledDemo { /** * 定时任务方法 * @Scheduled:设置定时任务 * cron属性:cron表达式。定时任务触发时间的一个字符串表达形式 */ @Scheduled(cron = "10,15 * 18 * 2 ?") public void scheduledMethod(){ System.out.println("定时器被触发"+new Date()); } }

      3、在启动类中开启定时任务的使用

    @SpringBootApplication @EnableScheduling //添加注解 public class App { public static void main(String[] args){ SpringApplication.run(App.class,args); } }

      4、cron 表达式讲解   Cron 表达式是一个字符串,分为6或7个域,每一个域代表一个含义Cron 有如下两种语法格式: (1) Seconds Minutes Hours Day Month Week Year (2)Seconds Minutes Hours Day Month Week   一、结构 corn从左到右(用空格隔开):秒,分,小时,月份中的日期,月份,星期中的日期,年份   二、各字段的含义 盗个图   例子: @Scheduled(cron = “0 0 1 1 1 ?”)//每年一月的一号的 1:00:00 执行一次 @Scheduled(cron = “0 0 1 1 1,6 ?”) //一月和六月的一号的 1:00:00 执行一次 @Scheduled(cron = “0 0 1 1 1,4,7,10 ?”) //每个季度的第一个月的一号的 1:00:00 执行一次 @Scheduled(cron = “0 0 1 1 * ?”)//每月一号 1:00:00 执行一次 @Scheduled(cron=“0 0 1 * * *”) //每天凌晨 1 点执行一次

        二、 SpringBoot 整合 Quartz 定时任务框架   1、Quartz 的介绍以及 Quartz 的使用思路   1.1、Quartz 的介绍   1.2、Quartz 的使用思路   1)job- 任务 - 你要做什么事?   2)Trigger- 触发器 - 你什么时候去做?   3)Scheduler- 任务调度 - 你什么时候需要去做什么事   2、Quartz 的基本使用方式   2.1、创建一个maven项目,并导入Quartz的坐标

    <dependencies> <!--Quartz坐标--> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency> </dependencies>

     

      2.2、创建 Job 类

    public class Quartz implements Job { /** * 任务被触发时所执行的方法 * * @param jobExecutionContext * @throws JobExecutionException */ public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println("Execute..."+new Date()); } }

        2.3、编写测试代码

    public class QuartzMain { public static void main(String[] args) throws SchedulerException { //1.创建Job对象:你要做什么事? JobDetail job=JobBuilder.newJob(Quartz.class).build(); /** * 简单的trigger触发时间,通过Quartz提供一个方法完成简单的重复调用 * cron Trigger表达式:按照cron的表达式来给定触发的事件 */ //2.创建Trigger对象:在什么时间做? // Trigger trigger=TriggerBuilder.newTrigger().withSchedule(SimpleScheduleBuilder.repeatSecondlyForever()).build(); Trigger trigger=TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")).build(); //3.创建Scheduler对象:在什么时间做什么事? Scheduler scheduler=StdSchedulerFactory.getDefaultScheduler(); scheduler.scheduleJob(job,trigger); //4.启动 scheduler.start(); } }

      3、SpringBoot 整合 Quartz 定时框架   3.1、修改 pom 文件添加坐标

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.qs</groupId> <artifactId>springbootquartz</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </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> <!--添加Scheduled坐标--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency> <!--Spring tx坐标--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> </dependency> </dependencies> </project>

        3.2、编写 Quartz 的启动类

    @Configuration public class QuartzConfig { /** * 1.创建Job对象 */ @Bean public JobDetailFactoryBean jobDetailFactoryBean(){ JobDetailFactoryBean factory=new JobDetailFactoryBean(); //关联我们自己的Job类 factory.setJobClass(QuartzDemo.class); return factory; } /** * 2.创建Trigger对象 * 简单的Trigger */ /*@Bean public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){ SimpleTriggerFactoryBean factory=new SimpleTriggerFactoryBean(); //关联JobDetail对象 factory.setJobDetail(jobDetailFactoryBean.getObject()); //什么时间做 该参数表示一个执行的毫秒数 factory.setRepeatInterval(2000); //执行次数(重复次数) factory.setRepeatCount(5); return factory; }*/ /** * Cron Trigger */ @Bean public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){ CronTriggerFactoryBean factory=new CronTriggerFactoryBean(); //关联JobDetail对象 factory.setJobDetail(jobDetailFactoryBean.getObject()); //设置触发时间 factory.setCronExpression("0/2 * * * * ?"); return factory; } /** * 3.创建Scheduler对象 */ @Bean public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean triggerFactoryBean){ SchedulerFactoryBean factory=new SchedulerFactoryBean(); //关联trigger factory.setTriggers(triggerFactoryBean.getObject()); return factory; } }

        3.3、修改启动类

    @SpringBootApplication @EnableScheduling //添加注解 public class App { public static void main(String[] args){ SpringApplication.run(App.class,args); } }

      4 Job 类中注入对象     4.1注入时会产生异常(空指针异常)     4.2、编写一个 MyAdaptableJobFactory 解决该问题

    @Component("myAdaptableJobFactory") public class MyAdaptableJobFactory extends AdaptableJobFactory { //AutowireCapableBeanFactory:可以将一个对象添加到SpringIOC容器中,并且完成该对象的属性注入 @Autowired private AutowireCapableBeanFactory autowireCapableBeanFactory; /** * 该方法需要将实例化的任务对象手动添加到SpringIOC容器中完成对象注入 * @param bundle * @return * @throws Exception */ @Override protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { Object obj=super.createJobInstance(bundle); //将obj对象添加到SprinbgIOC容器中,并完成注入 this.autowireCapableBeanFactory.autowireBean(obj); return obj; } }

        4.3、修改 QuartzConfig 类

    @Configuration public class QuartzConfig { /** * 1.创建Job对象 */ @Bean public JobDetailFactoryBean jobDetailFactoryBean(){ JobDetailFactoryBean factory=new JobDetailFactoryBean(); //关联我们自己的Job类 factory.setJobClass(QuartzDemo.class); return factory; } /** * 2.创建Trigger对象 * 简单的Trigger */ /*@Bean public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){ SimpleTriggerFactoryBean factory=new SimpleTriggerFactoryBean(); //关联JobDetail对象 factory.setJobDetail(jobDetailFactoryBean.getObject()); //什么时间做 该参数表示一个执行的毫秒数 factory.setRepeatInterval(2000); //执行次数(重复次数) factory.setRepeatCount(5); return factory; }*/ /** * Cron Trigger */ @Bean public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){ CronTriggerFactoryBean factory=new CronTriggerFactoryBean(); //关联JobDetail对象 factory.setJobDetail(jobDetailFactoryBean.getObject()); //设置触发时间 factory.setCronExpression("0/2 * * * * ?"); return factory; } /** * 3.创建Scheduler对象 */ @Bean public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean triggerFactoryBean,MyAdaptableJobFactory myAdaptableJobFactory){ SchedulerFactoryBean factory=new SchedulerFactoryBean(); //关联trigger factory.setTriggers(triggerFactoryBean.getObject()); factory.setJobFactory(myAdaptableJobFactory); return factory; } }
    最新回复(0)