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

SpringBoot定时任务两种(Spring Schedule 与 Quartz 整合 )实现方法

程序员文章站 2024-03-04 10:55:05
前言 最近在项目中使用到定时任务,之前一直都是使用quartz 来实现,最近看spring 基础发现其实spring 提供 spring schedule 可以帮助我们实...

前言

最近在项目中使用到定时任务,之前一直都是使用quartz 来实现,最近看spring 基础发现其实spring 提供 spring schedule 可以帮助我们实现简单的定时任务功能。

下面说一下两种方式在spring boot 项目中的使用。

spring schedule 实现定时任务

spring schedule 实现定时任务有两种方式 1. 使用xml配置定时任务, 2. 使用 @scheduled 注解。 因为是spring boot 项目 可能尽量避免使用xml配置的形式,主要说注解的形式.

spring schedule 提供三种形式的定时任务:

固定等待时间 @scheduled(fixeddelay = 时间间隔 )

@component
public class schedulejobs {
  public final static long second = 1 * 1000;
  fastdateformat fdf = fastdateformat.getinstance("yyyy-mm-dd hh:mm:ss");


  @scheduled(fixeddelay = second * 2)
  public void fixeddelayjob() throws interruptedexception {
    timeunit.seconds.sleep(2);
    system.out.println("[fixeddelayjob execute]"+fdf.format(new date()));
  }
}

固定间隔时间 @scheduled(fixedrate = 时间间隔 )

@component
public class schedulejobs {
  public final static long second = 1 * 1000;
  fastdateformat fdf = fastdateformat.getinstance("yyyy-mm-dd hh:mm:ss");


  @scheduled(fixedrate = second * 4)
  public void fixedratejob() {
    system.out.println("[fixedratejob execute]"+fdf.format(new date()));
  }
}

corn表达式 @scheduled(cron = corn表达式)

@component
public class schedulejobs {
  public final static long second = 1 * 1000;
  fastdateformat fdf = fastdateformat.getinstance("yyyy-mm-dd hh:mm:ss");


  @scheduled(cron = "0/4 * * * * ?")
  public void cronjob() {
    system.out.println("[cronjob execute]"+fdf.format(new date()));
  }
}

spring boot 整合 quartz 实现定时任务

添加maven依赖

    <dependency>
      <groupid>org.quartz-scheduler</groupid>
      <artifactid>quartz</artifactid>
    </dependency>
    <dependency>
      <groupid>org.springframework</groupid>
      <artifactid>spring-context-support</artifactid>
    </dependency>

spring boot 整合 quartz

spring 项目整合 quartz 主要依靠添加 schedulerfactorybean 这个 factorybean ,所以在maven 依赖中添加 spring-context-support 。

首先添加 quartzconfig 类 来声明相关bean

@configuration
public class quartzconfig {
  @autowired
  private springjobfactory springjobfactory;

  @bean
  public schedulerfactorybean schedulerfactorybean() {
    schedulerfactorybean schedulerfactorybean = new schedulerfactorybean();
    schedulerfactorybean.setjobfactory(springjobfactory);
    return schedulerfactorybean;
  }

  @bean
  public scheduler scheduler() {
    return schedulerfactorybean().getscheduler();
  }
}

这里我们需要注意 我注入了一个 自定义的jobfactory ,然后 把其设置为schedulerfactorybean 的 jobfactory。其目的是因为我在具体的job 中 需要spring 注入一些service。

 所以我们要自定义一个jobfactory, 让其在具体job 类实例化时 使用spring 的api 来进行依赖注入。

springjobfactory 具体实现:

@component
public class springjobfactory extends adaptablejobfactory {

  @autowired
  private autowirecapablebeanfactory capablebeanfactory;

  @override
  protected object createjobinstance(triggerfiredbundle bundle) throws exception {
    object jobinstance = super.createjobinstance(bundle);
    capablebeanfactory.autowirebean(jobinstance);
    return jobinstance;
  }
}

具体使用 (摘取自项目代码):

@service
public class quartzeventserviceimpl implements quartzeventservice {
  private static final string job_group = "event_job_group";
  private static final string trigger_group = "event_trigger_group";
  @autowired
  private scheduler scheduler;

  @override
  public void addquartz(event event) throws schedulerexception {
    jsonobject eventdata = jsonobject.parseobject(event.geteventdata());
    date triggerdate = eventdata.getdate("date");
    jobdetail job = jobbuilder.newjob(eventjob.class).withidentity(event.getid().tostring(), job_group).usingjobdata(buildjobdatemap(event)).build();
    trigger trigger = triggerbuilder.newtrigger().withidentity(event.getid().tostring(), trigger_group).startat(triggerdate).build();
    scheduler.schedulejob(job, trigger);
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇: JAVA基础知识之File类

下一篇: