quartz是一个非常强大的任务调度器。我们可能使用它来管理我们的项目,常见的是做业绩统计等等。当然它的功能远不止这些。我们在这里不介绍quartz的原理,下面讲讲如何在springboot中使用quartz。

废话不多说,直接上源码:

首先看一下我们需要利用quartz执行的类和方法

  1. productSellDailyService接口:
  1. /**
  2. * 统计日销量的业务逻辑层
  3. */
  4. public interface ProductSellDailyService {
  5. //每日定时对店铺的销量进行统计
  6. void dailyCalculate();
  7. }
  1.  

对应的实现类:

  1. import net.cqwu.collegeo2o.dao.ProductSellDailyMapper;
  2. import net.cqwu.collegeo2o.service.ProductSellDailyService;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Service;
  7.  
  8. @Service
  9. public class ProductSellDailyServiceImpl implements ProductSellDailyService {
  10.  
  11. private static final Logger log = LoggerFactory.getLogger(ProductSellDailyServiceImpl.class);
  12.  
  13. @Autowired
  14. private ProductSellDailyMapper productSellDailyMapper;
  15.  
  16. /**
  17. * 调用quartz每日定时对店铺的商品销量进行统计
  18. */
  19. @Override
  20. public void dailyCalculate() {
  21. log.info("Quartz is running!!");
  22. //调用持久层的方法,每天对店铺的销量进行统计,插入数据库中。
  23. productSellDailyMapper.insertProductSellDaily();
  24. }
  25. }

下面是quartz的配置:

  1. import net.cqwu.collegeo2o.service.ProductSellDailyService;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
  6. import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
  7. import org.springframework.scheduling.quartz.SchedulerFactoryBean;
  8.  
  9. /**
  10. * 引入quartz (时间调度),按照我们规定的时间执行指定的任务
  11. *
  12. */
  13. @Configuration
  14. public class QuartzConfiguration {
  15. @Autowired
  16. private ProductSellDailyService productSellDailyService;
  17. @Autowired
  18. private MethodInvokingJobDetailFactoryBean jobDetailFactory;
  19. @Autowired
  20. private CronTriggerFactoryBean productSellDailyFactory;
  21. /**
  22. * quartz三部曲的第一部,创建jobdetail对象(jobdetail与我们需要执行的事件进行绑定)
  23. * @return
  24. */
  25. @Bean(name = "jobDetailFactory")
  26. public MethodInvokingJobDetailFactoryBean createJobDetail(){
  27. //new出jobDetailFactoryBean对象,此工厂主要用来执着一个jobdetail对象,即制作一个任务,
  28. //由于我们所做的任务其本质就是定时执行一个方法,所以用本工厂比较方便
  29. MethodInvokingJobDetailFactoryBean jobDetailFactoryBean = new MethodInvokingJobDetailFactoryBean();
  30. //设置jobDetail的名字
  31. jobDetailFactoryBean.setName("product_sell_daily_job");
  32. //设置jobDetail的组
  33. jobDetailFactoryBean.setGroup("product_sell_daily_group");
  34. //对于同一个jobDetail,如果被多个触发器绑定了,那么很有很可能第一个job没执行完成,第二个job就开始了
  35. //设置Concurrent为false可以避免这种情况,即在第一个job未完成之前第二个job不会开始。
  36. jobDetailFactoryBean.setConcurrent(false);
  37. //绑定运行任务的类,这里比较关键,我们需要执行的任务都在该类中jobDetailFactoryBean.setTargetObject(productSellDailyService);
  38. //绑定运行任务类中的方法jobDetailFactoryBean.setTargetMethod("dailyCalculate");
  39. return jobDetailFactoryBean;
  40. }
  41.  
  42. /**
  43. * quartz三部曲中的第二部,创建触发器,并配置触发器。在触发器中绑定jobDetail
  44. * @return
  45. */
  46. @Bean(name = "productSellDailyFactory")
  47. public CronTriggerFactoryBean createProductSellDailyTrigger(){
  48. CronTriggerFactoryBean triggerFactory = new CronTriggerFactoryBean();
  49. //设置触发器的名字
  50. triggerFactory.setName("product_sell_daily_trigger");
  51. //设置触发器的组
  52. triggerFactory.setGroup("product_sell_daily_group");
  53. //绑定jobDetail
  54. triggerFactory.setJobDetail(jobDetailFactory.getObject());
  55. //设置一些自定义参数
  56. // triggerFactory.setJobDataMap();
  57. //设置cron表达式(也可以使用simpltrigger)。即任务执行的时间。triggerFactory.setCronExpression("0 0 0 * * ? *"); //每天的00:00:00执行任务
  58. return triggerFactory;
  59. }
  60.  
  61. /**
  62. * 第三部,创建调度工厂,让调度工厂绑定触发器
  63. * @return
  64. */
  65. @Bean(name="schedulerFactory")
  66. public SchedulerFactoryBean createScheduleFactoryBean(){
  67. SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
  68. //绑定触发器
  69. schedulerFactoryBean.setTriggers(productSellDailyFactory.getObject());
  70. return schedulerFactoryBean;
  71. }
  72. }

以上就已经配置好了quartz。主要还是核心的三步,第一步:创建jobDetail并绑定需要利用quartz执行的任务、第二步、创建trigger触发器,并绑定jobDetail.第三步、创建schedule并绑定触发器。

这样我们在启动项目的时候,quartz就已经被启动了。然后他会自动在我们规定的时间执行我们规定的业务。当然如果大家对cron表达式不太熟悉可以在百度搜索 cron表达式生成器。

在springboot项目中引入quartz任务调度器。的更多相关文章

  1. 在SpringBoot项目中添加SpringMVC拦截器

    1.认识拦截器 SpringMVC的拦截器(Interceptor)不是Filer,同样可以实现请求的预处理.后处理.使用拦截器仅需要两个步骤 实现拦截器 注册拦截器 1.1实现拦截器 实现拦截器可以 ...

  2. Springboot 项目中引入WebSocket后,单元测试出现错误

    报错信息 java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test. ...

  3. 后端分页神器,mybatis pagehelper 在SSM与springboot项目中的使用

    mybatis pagehelper想必大家都耳熟能详了,是java后端用于做分页查询时一款非常好用的分页插件,同时也被人们称为mybatis三剑客之一,下面 就给大家讲讲如何在SSM项目和sprin ...

  4. springboot(五).如何在springboot项目中使用拦截器

    在每个项目中,拦截器都是我们经常会去使用的东西,基本上任一一个项目都缺不了拦截器的使用. 如日志记录.登录验证,session验证等,都需要拦截器来拦截URL请求,那springboot中的拦截器是如 ...

  5. 项目中使用Quartz集群分享--转载

    项目中使用Quartz集群分享--转载 在公司分享了Quartz,发布出来,希望大家讨论补充. CRM使用Quartz集群分享  一:CRM对定时任务的依赖与问题  二:什么是quartz,如何使用, ...

  6. 在Android项目中引入MuPdf

    由于公司手机App要加入一个附件查看功能,需要查看PDF文件,在网上找了许多第三方工具,最后选择了MuPDF. 更多第三方工具可以查看大神总结的:http://www.cnblogs.com/poke ...

  7. 如何在项目中引入 #include .h、.lib、 .dll、.cpp (转)

    源:http://blog.csdn.net/vippolka/article/details/8552735 在项目中引入.h..lib和dll.以及.cpp 1..h的引入 解决办法1:把  XX ...

  8. SpringBoot12 QueryDSL01之QueryDSL介绍、springBoot项目中集成QueryDSL

    1 QueryDSL介绍 1.1 背景 QueryDSL的诞生解决了HQL查询类型安全方面的缺陷:HQL查询的扩展需要用字符串拼接的方式进行,这往往会导致代码的阅读困难:通过字符串对域类型和属性的不安 ...

  9. springboot项目中js、css静态文件路径访问

    springboot静态文件访问的问题,相信大家也有遇到这个问题,如下图项目结构. 项目结构如上所示,静态页面引入js.css如下所示. 大家肯定都是这样写的,但是运行的话就是出不来效果,图片也不显示 ...

随机推荐

  1. go append 函数常见操作

    1. 将切片 b 的元素追加到切片 a 之后: a = append(a, b...) 2. 复制切片 a 的元素到新的切片 b 上: 1. b = make([]T, len(a)) 2. copy ...

  2. 最新NetSarang Xmanager安装激活-XShell、XFtp

    NetSarang Xmanager Enterprise 是一个简单易用的高性能的运行在 Windows 平台上的 X Server 软件.它能把远端 Unix/Linux 的桌面无缝地带到你的Wi ...

  3. 题解 AT5632 【Sum of Two Integers】

    在幼儿园的时候,我们就学习过把一个数分成\(a\)与\(b\),我们只需要用计算机来模拟这个过程就可以了. 我们先从奇数开始看起,以\(5\)为例: 我们可以发现,\(5\)可以分成\(1\)和\(4 ...

  4. 2017-9-15Opencv 杂

    Mat::at()的具体含义.指的是三通道.(0),(1),(2)分别表示BGR: Vector<Mat>结构的使用.将Mat类型的数据转化成了具有多个单通道的容器? 灰度图的具体含义.和 ...

  5. Unable to open debugger port (127.0.0.1:13249): java.net.BindException "Address already in use: JVM_Bind"

    这个问题比较简单一点,Tomcat的端口被占用了,我使用的是IDEA里的一个热部署插件JReble,更新了IDEA之后就发现端口被占用了,可能我电脑没有重启过吧, 一直被占用着,所以解决方法就是更换一 ...

  6. linux 配置compoer

    配置默认php 删除 rm -f /usr/bin/php 改到php7.3版本的composer /bin/php /usr/bin/php 多版本支持 配置php7专用composer70 cd ...

  7. javaweb基础备忘

    Request对象的主要方法有哪些 setAttribute(String name,Object):设置名字为name的request 的参数值 getAttribute(String name): ...

  8. 数据预处理 | 使用 OneHotEncoder 及 get_dummuies 将分类型数据转变成哑变量矩阵

    [分类数据的处理] 问题: 在数据建模过程中,很多算法或算法实现包无法直接处理非数值型的变量,如 KMeans 算法基于距离的相似度计算,而字符串则无法直接计算距离 如: 性别中的男和女 [0,1] ...

  9. 在SQL中怎么把一列字符串拆分为多列

    --首先,你是按什么规则拆? 我举个例子 你要按字段中的逗号拆开,假设字段名叫text --用charindex和substring这2个函数    select substring(text,1,c ...

  10. PYthon之路Day12

    生成器 核心:生成器的本质就是一个迭代器 程序员自己写的一种迭代器 作用:节省空间 生成器可以使用for进行遍历 生成器编写方式: 基于函数编写 def func():    print('这是一个函 ...