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

一,可以有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即可。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值