SpringBoot实现定时任务的三种方式

    科技2022-07-14  126

    一,可以有3种方式配置定时任务

    Timer TimerTask

    Quartz Scheduler

    Task Execution and Scheduling

    二, Quartz Scheduler( 配置较为复杂)

      1. 引用依赖

      <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-quartz</artifactId>   </dependency>

    2.启动类上添加 @EnableScheduling注解,开启定时任务

    3.定义Job

    1)

    @Component public class MyFirstJob { public void hello(){ System.out.println("MyFirstJob:hello:"+new Date()); } }

    2)

    public class MySecondJob extends QuartzJobBean { private String name; public void setName(String name) { this.name = name; } @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { System.out.println("hello:"+name+":"+new Date()); } }

    4,配置jobdetail,trigger,scheduleFactory

    @Configuration public class QuartzConfig {          /**     *  使用 MethodInvokingJobDetailFactoryBean      *  可以配置目标 Bean 的名字和目标方法的名字,这种方式不支持传参          */

     1)第一种jobDetail方式     @Bean     MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean(){         MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean();         bean.setTargetBeanName("myFirstJob");         bean.setTargetMethod("hello");         return bean;     }   2)第二种jobDetail方式       /**     *  使用JobDetailFactoryBean 可以配置 JobDetail ,任务类继承自 QuartzJobBean,      *   这种方式支持传参,将参数封装在 JobDataMap 中进行传递,     *   job中只需要提供属性名和相应的set方法即可     */     @Bean     JobDetailFactoryBean jobDetailFactoryBean(){         JobDetailFactoryBean bean = new JobDetailFactoryBean();         JobDataMap map = new JobDataMap();         map.put("name","ljx");         bean.setJobDataMap(map);         bean.setJobClass(MySecondJob.class);         return bean;     }

    3)第一种simple trigger   

      /**     *  SimpleTrigger 类似于前面说的 @Scheduled 的基本用法     *   首先设置JobDetail, setStartTime设置开始时间,     *   setRepeatInterval任务的时间间隔,setRepeatCount任务的循环次数     */     @Bean     SimpleTriggerFactoryBean simpleTriggerFactoryBean(){         SimpleTriggerFactoryBean bean = new SimpleTriggerFactoryBean();         bean.setJobDetail(methodInvokingJobDetailFactoryBean().getObject());         bean.setStartTime(new Date());         bean.setRepeatInterval(2000);         bean.setRepeatCount(3);         return bean;     }  4) 第二种 CronTrigger       /**     *  CronTrigger 类似于 @Scheduled 中 cron 表达式的用法     *   主要配置JobDetail和Cron表达式     */     @Bean     CronTriggerFactoryBean cronTriggerFactoryBean(){         CronTriggerFactoryBean bean = new CronTriggerFactoryBean();         bean.setJobDetail(jobDetailFactoryBean().getObject());         bean.setCronExpression("* * * * * ?");         return bean;     }

       5) 将trigger配置到 Schedulerfactory

     /**     *  创建schedulerFactory,配置相应的Trigger     */     @Bean     SchedulerFactoryBean schedulerFactoryBean(){         SchedulerFactoryBean bean = new SchedulerFactoryBean();         bean.setTriggers(simpleTriggerFactoryBean().getObject()                          ,cronTriggerFactoryBean().getObject());         return bean;     } } 三,Task Execution and Scheduling

    spring 内置的,可以看做是轻量级的quartz

    1. 启动类上添加 @EnableScheduling注解,开启定时任务

    2. 建立job

    3.配置多线程运行

    @Configuration public class ScheduleConfig implements SchedulingConfigurer {     @Override     public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {         //参数传入一个size为10的线程池         taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));     } }

    SchedulingConfigurer默认会单线程运行,当任务多时,需要配置多线程运行

    四,Timer TimerTask

    Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。

    1. 建job

    class Task extends TimerTask {

      @Override

      public void run() {

      }

    }

    2.执行

      1)timer = new Timer(true);   timer.schedule(new Task(), 30000);

            延时多少毫秒后执行此task。

       2)schedule(TimerTask task, long delay, long period) 每隔**毫秒运行一次

    五,总结

    目前在spring boot中,我们只需要用内置的Task Execution and Scheduling即可。

     

    Processed: 0.014, SQL: 8