Springboot的定时任务详解

定时任务

  • 使用@Scheduled

    在这里插入图片描述

    @Scheduled 注解也支持 cron 表达式,使用 cron 表达式,可以非常丰富的描述定时任务的时间

  • Quartz

    1. 添加依赖

      <dependency>
      	<groupId>org.springframework.boot</groupId>
      	<artifactId>spring-boot-starter-quartz</artifactId>
      </dependency>
      
    2. 开启定时任务注解

      @SpringBootApplication
      @EnableScheduling
      public class QuartzdemoApplication {
      
      	public static void main(String[] args) {
      		SpringApplication.run(QuartzdemoApplication.class, args);
      	}
      
      }
      

    Quartz 在使用过程中,有两个关键概念,一个是JobDetail(要做的事情),另一个是触发器(什么时候做),要定义 JobDetail,需要先定义 Job,Job 的定义有两种方式:

    1. 第一种方式,直接定义一个Bean:

      @Component
      public class MyJob1 {
          public void sayHello() {
              System.out.println("MyJob1>>>"+new Date());
          }
      }
      

      注意:这种方式无法传参。

    2. 第二种定义方式,则是继承 QuartzJobBean 并实现默认的方法:

      public class MyJob2 extends QuartzJobBean {
          HelloService helloService;
          public HelloService getHelloService() {
              return helloService;
          }
          public void setHelloService(HelloService helloService) {
              this.helloService = helloService;
          }
          @Override
          protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
              helloService.sayHello();
          }
      }
      public class HelloService {
          public void sayHello() {
              System.out.println("hello service >>>"+new Date());
          }
      }
      

      Job 有了之后,接下来创建类,配置 JobDetail 和 Trigger 触发器,如下:

      @Configuration
      public class QuartzConfig {
          @Bean
          MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean() {
              MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean();
              bean.setTargetBeanName("myJob1");
              bean.setTargetMethod("sayHello");
              return bean;
          }
          @Bean
          JobDetailFactoryBean jobDetailFactoryBean() {
              JobDetailFactoryBean bean = new JobDetailFactoryBean();
              bean.setJobClass(MyJob2.class);
              JobDataMap map = new JobDataMap();
              map.put("helloService", helloService());
              bean.setJobDataMap(map);
              return bean;
          }
          @Bean
          SimpleTriggerFactoryBean simpleTriggerFactoryBean() {
              SimpleTriggerFactoryBean bean = new SimpleTriggerFactoryBean();
              bean.setStartTime(new Date());
              bean.setRepeatCount(5);
              bean.setJobDetail(methodInvokingJobDetailFactoryBean().getObject());
              bean.setRepeatInterval(3000);
              return bean;
          }
          @Bean
          CronTriggerFactoryBean cronTrigger() {
              CronTriggerFactoryBean bean = new CronTriggerFactoryBean();
              bean.setCronExpression("0/10 * * * * ?");
              bean.setJobDetail(jobDetailFactoryBean().getObject());
              return bean;
          }
          @Bean
          SchedulerFactoryBean schedulerFactoryBean() {
              SchedulerFactoryBean bean = new SchedulerFactoryBean();
              bean.setTriggers(cronTrigger().getObject(), simpleTriggerFactoryBean().getObject());
              return bean;
          }
          @Bean
          HelloService helloService() {
              return new HelloService();
          }
      }
      
      1. JobDetail 的配置有两种方式:MethodInvokingJobDetailFactoryBean 和 JobDetailFactoryBean 。
      2. 使用 MethodInvokingJobDetailFactoryBean 可以配置目标 Bean 的名字和目标方法的名字,这种方式不支持传参。
      3. 使用 JobDetailFactoryBean 可以配置 JobDetail ,任务类继承自 QuartzJobBean ,这种方式支持传参,将参数封装在 JobDataMap 中进行传递。
      4. Trigger 是指触发器,Quartz 中定义了多个触发器,这里向大家展示其中两种的用法,SimpleTrigger 和 CronTrigger 。
      5. SimpleTrigger 有点类似于前面说的 @Scheduled 的基本用法。
      6. CronTrigger 则有点类似于 @Scheduled 中 cron 表达式的用法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值