前言

最近在项目中使用到定时任务,之前一直都是使用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 {@Autowiredprivate SpringJobFactory springJobFactory;@Beanpublic SchedulerFactoryBean schedulerFactoryBean() {SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();schedulerFactoryBean.setJobFactory(springJobFactory);return schedulerFactoryBean;}@Beanpublic Scheduler scheduler() {return schedulerFactoryBean().getScheduler();}
}

这里我们需要注意 我注入了一个 自定义的JobFactory ,然后 把其设置为SchedulerFactoryBean 的 JobFactory。其目的是因为我在具体的Job 中 需要Spring 注入一些Service。
所以我们要自定义一个jobfactory, 让其在具体job 类实例化时 使用Spring 的API 来进行依赖注入。

SpringJobFactory 具体实现:

@Component
public class SpringJobFactory extends AdaptableJobFactory {@Autowiredprivate AutowireCapableBeanFactory capableBeanFactory;@Overrideprotected 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";@Autowiredprivate Scheduler scheduler;@Overridepublic 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);}

SpringBoot两种定时任务(Spring Schedule 与 Quartz 整合 )实现相关推荐

  1. 继承WebMvcConfigurer 和 WebMvcConfigurerAdapter类依然CORS报错? springboot 两种方式稳定解决跨域问题

    继承WebMvcConfigurer 和 WebMvcConfigurerAdapter类依然CORS报错???springboot 两种方式稳定解决跨域问题! 之前我写了一篇文章,来解决CORS报错 ...

  2. SpringBoot系列:Spring Boot定时任务Spring Schedule,springboot视频教程迅雷

    @EnableScheduling @Component public class Task { private static final SimpleDateFormat dateFormat = ...

  3. 第二节:比较DateTime和DateTimeOffset两种时间类型并介绍Quartz.Net中用到的几类时间形式(定点、四舍五入、倍数、递增)

    一. 时间的类型 1. 背景 这里为什么要介绍时间类型呢,明明是定时调度篇,原因是在定时任务中,任务什么时间开始执行,什么时间结束执行,要用到各种各样的时间模式,虽然这不能算是一个复杂的问题,但在正式 ...

  4. Spring+SpringMVC+mybatis+Quartz整合

    Quartz与SpringMVC的整合 简介 Quartz是一个完全由java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制.Quartz允许开发人员根据时间间隔来调 ...

  5. 热乎乎的面经:Spring中Scheduled和Async两种调度方式有啥区别?

    最近有小伙伴出去面试,回来跟我说:冰河,我去XXX公司面试,面试官竟然问了我一个关于Spring中Scheduled和Async调度的问题,我竟然没回答上来,你能不能写一篇关于这个问题的文章呢?我:可 ...

  6. android中的定时任务一般有两种机制,android 定时任务

    使用timertask进行定时任务 首先创建TimerTask: class SynchroTimerTask extends TimerTask { @Override public void ru ...

  7. spring中AOP动态代理的两种方式

    AOP动态代理的两种方式 Spring AOP动态代理的方式(spring的AOP默认是JDK Proxy) 浅谈这两种动态代理 JDK的动态代理,需要有实现接口 动态代理--JDK Proxy ⚫ ...

  8. Spring Job?Quartz?XXL-Job?年轻人才做选择,艿艿全莽~

    本文在提供完整代码示例,可见 https://github.com/YunaiV/SpringBoot-Labs 的 lab-28 目录. 原创不易,给点个 Star 嘿,一起冲鸭! 1. 概述 在产 ...

  9. SpringBoot三种方法实现定时发送邮件的案例

    介绍 这里是小编成长之路的历程,也是小编的学习之路.希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡. 一个人为什么要努力? ...

  10. Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别

    视频功能审核通过了,可以看视频啦!记得点关注啊~ 注意:因为网络原因,视频前一两分钟可能会比较模糊,过一会儿就好了 记得点关注啊,视频里的wx二维码失效了,wx搜索:"聊5毛钱的java&q ...

最新文章

  1. WebConfig的经典使用,大家一起交流一下吧!!!
  2. springboot读取自定义properties文件
  3. 04 breakcontinue
  4. ie浏览器如何实现scrollto_如何实现报表直接打印需求
  5. mui与java开发实例_mui开发的app例子,非常好资源,适合初学者
  6. react 父子传值_React父子组件传值
  7. python基础学习1-字典的使用
  8. Linux下rpm安装MySQL及配置
  9. Chapter第六章
  10. html编写代码制作网站教程,html代码编写教程
  11. linux c++ 时间戳转换,C++时间戳转换成日期时间的步骤和示例代码
  12. 游戏美术基础:游戏贴图
  13. 骨传导耳机的作用有哪些?骨传导耳机的好处盘点
  14. 35岁的程序员:第30章,表白
  15. 这可能是最完整的进藏攻略
  16. hadoop编程实战——日志分析
  17. android Git版本控制
  18. 006.UG_NX实体造型功能
  19. java jsp页面传值_JSP 页面传值方法总结
  20. IOST与Gravity达成战略合作,链接Gravity网络携手开发跨链集成

热门文章

  1. 80. Session
  2. jsp标签 meta的解释
  3. linux硬件 软件raid,linux学习之路之磁盘阵列RAID及硬件RAID和软件RAID的区别
  4. oracle错误输出,oracle – SQL小提琴输出错误
  5. c++ builder 存储过程 mysql mssql_C++ Builder实现Microsoft SQL Server 2000 的扩展存储过程...
  6. 问题:jquery中的change()事件,以及jquery中的prop()事件与attr()事件的区别
  7. [Bzoj1143][CTSC2008]祭祀river
  8. python 匿名函数 与 重要的内置函数
  9. 寄售Consignment和VMI有什么区别?
  10. Spring - DI循环依赖