欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Springboot定时任务

程序员文章站 2022-04-12 22:10:01
定时任务使用@Scheduled@Scheduled 注解也支持 cron 表达式,使用 cron 表达式,可以非常丰富的描述定时任务的时间Quartz添加依赖org.springframework.bootspring-boot-starter-quartz...

定时任务

  • 使用@Scheduled

    Springboot定时任务

    @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 表达式的用法。

本文地址:https://blog.csdn.net/Actor2/article/details/107691171

相关标签: JAVA spring boot