当前位置: 移动技术网 > IT编程>开发语言>Java > SpringBoot定时任务两种(Spring Schedule 与 Quartz 整合 )实现方法

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

yq,中华民谣伴奏,美伊美美容仪

前言

最近在项目中使用到定时任务,之前一直都是使用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);
  }

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网