本片文章续《Spring Boot 入门(八):集成RabbitMQ消息队列》,关于Quartz定时任务请参考《Quartz的基本使用之入门(2.3.0版本)

spring boot实现定时任务,除了集成Quartz外,还可以直接使用scheduler注解。使用1个简单的注解就可以完成,为什么还要较为复杂的集成Quartz呢?这里我简单回答下这2中方式的区别,这也是我在项目中为什么要选择Quartz这种方式。

1.scheduler注解方式,一旦定时任务产生异常,那么此定时任务就无法再次启动,意味该定时任务就失效了,而Quartz不会。

2.scheduler注解方式,当前面的定时任务没有完成的时候,无法再次开启定时任务,这说明scheduler注解方式是单线程,而Quartz是多线程,同一定时任务可以并发处理。

3.scheduler注解方式,对于定时的格式很少,只能简单的在注解中配置,很多复杂的定时任务没法完成,而Quartz的格式很丰富,可以配置各种各样的定时任务。

基于上述原因,定时任务应该选择Quartz。

1.增加依赖

  1. <!--quartz-->
  2. <dependency>
  3. <groupId>org.quartz-scheduler</groupId>
  4. <artifactId>quartz</artifactId>
  5. <version>2.2.1</version>
  6. </dependency>
  7. <!-- 该依赖必加,里面有sping对schedule的支持 -->
  8. <dependency>
  9. <groupId>org.springframework</groupId>
  10. <artifactId>spring-context-support</artifactId>
  11. </dependency>

2.增加conf

  1. package
  2. import org.quartz.*;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Service;
  5.  
  6. /**
  7. * @program:
  8. * @description: 定时任务创建job,通过注入Scheduler对任务进行操作
  9. * @author: DZ
  10. * @create: 2019-10-19 18:28
  11. **/
  12. @Service
  13. public class QuartzConf {
  14. private static final String JOB_GROUP = "job_group";
  15. private static final String TRIGGER_GROUP = "trigger_group";
  16. @Autowired
  17. private Scheduler scheduler;
  18.  
  19. /**
  20. * 创建定时任务
  21. *定义相应的任务(JobDetial)和触发器(trigger),并将其加到一个执行日程(Scheduler)中,并通过监听器启动日程。
  22. * @param jobDetailName
  23. * @param cronExpression
  24. * @param jobClass
  25. * @throws SchedulerException
  26. */
  27. public void createScheduleJob(String jobDetailName, String cronExpression, Class<? extends Job> jobClass) throws SchedulerException {
  28. JobDetail jobDetail = JobBuilder.newJob(jobClass)
  29. .withIdentity("task_" + jobDetailName, JOB_GROUP).storeDurably().requestRecovery().build();
  30. CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
  31. Trigger trigger = TriggerBuilder.newTrigger().withIdentity("task_" + jobDetailName, TRIGGER_GROUP).withSchedule(scheduleBuilder).build();
  32. scheduler.scheduleJob(jobDetail, trigger);
  33. }
  34. }

3.增加过滤器

  1. import lombok.extern.slf4j.Slf4j;
  2. import org.quartz.SchedulerException;
  3. import org.slf4j.MDC;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.context.ApplicationListener;
  6. import org.springframework.context.annotation.Configuration;
  7. import org.springframework.context.event.ContextRefreshedEvent;
  8.  
  9. import java.util.UUID;
  10.  
  11. /**
  12. * @program:
  13. * @description: 启动监听去初始化Quartz
  14. * @author: DZ
  15. * @create: 2019-10-19 18:32
  16. **/
  17. @Slf4j
  18. @Configuration
  19. public class ApplicationStartQuartzJobListener implements ApplicationListener<ContextRefreshedEvent> {
  20. @Autowired
  21. private QuartzConf quartzConf;
  22.  
  23. /* 时间格式:
  24. * * * * * * *
  25. [秒] [分] [小时] [日] [月] [周] [年]*/
  26.  
  27. /**
  28. * 初始启动quartz
  29. */
  30. @Override
  31. public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
  32. try {
  33. log.info("任务开始启动...");
  34. quartzConf.createScheduleJob("TestTask", "*/30 * * * * ?", TestTask.class);
  35. log.info("任务已经启动...");
  36. } catch (SchedulerException e) {
  37. log.error("定时任务启动失败", e);
  38. }
  39. }
  40. }

如果整个项目就一个定时任务,其实也不需要过滤器,直接将定时任务的类名写在cong中即可。如果有多个定时任务,定义多个trigger和job也可以。这样代码的冗余度比较高

此监听器的作用在于:项目启动的时候,监听器将所有的定时任务注册到日程中,相当于开启定时任务。从而做到了只需要定义一套trigger和job就可以写多个定时任务。

4.写定时任务

  1. import lombok.extern.slf4j.Slf4j;
  2. import org.quartz.Job;
  3. import org.quartz.JobExecutionContext;
  4. import org.quartz.JobExecutionException;
  5. import org.quartz.JobKey;
  6. import org.slf4j.MDC;
  7.  
  8. import java.util.UUID;
  9.  
  10. /**
  11. * @program:
  12. * @description: 测试定时任务
  13. * @author: DZ
  14. * @create: 2019-10-19 18:49
  15. **/
  16. @Slf4j
  17. public class TestTask implements Job {
  18. @Override
  19. public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
  20. JobKey key = jobExecutionContext.getJobDetail().getKey();
  21. // todo 业务逻辑
  22. log.info("----------" + key + "任务执行中,currentTime:" + DateUtil.getCurrentDate());
  23. }
  24. }

这个位置除了实现Job接口外,还可以继承QuartzJobBean类,其实QuartzJobBean也是Job的子类,只不过对部分参数进行了初始化

启动服务,查看结果

此外,如果不对定时任务做线程池的配置,那么默认是10个线程,这里也可以增加对线程池的配置,在yml中增加属性:

  1. Spring:
  2. # quartz定时器配置
  3. quartz:
  4. properties:
  5. org:
  6. quartz:
  7. scheduler:
  8. instanceName: quartzScheduler
  9. instanceId: AUTO
  10. threadPool:
  11. class: org.quartz.simpl.SimpleThreadPool
  12. threadCount: 20
  13. threadPriority: 5
  14. threadsInheritContextClassLoaderOfInitializingThread: true

此时就是定义了20个线程

Spring Boot 入门(九):集成Quartz定时任务的更多相关文章

  1. Spring Boot 入门(十):集成Redis哨兵模式,实现Mybatis二级缓存

    本片文章续<Spring Boot 入门(九):集成Quartz定时任务>.本文主要基于redis实现了mybatis二级缓存.较redis缓存,mybaits自带缓存存在缺点(自行谷歌) ...

  2. Spring Boot 入门(六):集成 treetable 和 zTree 实现树形图

    本篇文章是接着Spring Boot 入门(五):集成 AOP 进行日志管理写的,主要集成了树形图,在部门列表或者权限列表中,树形图经常被用上.主要是根据相应的 API 凭借 html 字符串 1.t ...

  3. Spring Boot 入门(五):集成 AOP 进行日志管理

    本篇文章是接着 Spring boot 入门(四):集成 Shiro 实现登陆认证和权限管理写的,按照前面几篇博客的教程,可以搭建一个简单的项目,主要包含了 Pagehelper+MyBatis 分页 ...

  4. Spring boot 入门(四):集成 Shiro 实现登陆认证和权限管理

    本文是接着上篇博客写的:Spring boot 入门(三):SpringBoot 集成结合 AdminLTE(Freemarker),利用 generate 自动生成代码,利用 DataTable 和 ...

  5. Spring boot入门(三):SpringBoot集成结合AdminLTE(Freemarker),利用generate自动生成代码,利用DataTable和PageHelper进行分页显示

    关于SpringBoot和PageHelper,前篇博客已经介绍过Spring boot入门(二):Spring boot集成MySql,Mybatis和PageHelper插件,前篇博客大致讲述了S ...

  6. Spring boot入门(二):Spring boot集成MySql,Mybatis和PageHelper插件

    上一篇文章,写了如何搭建一个简单的Spring boot项目,本篇是接着上一篇文章写得:Spring boot入门:快速搭建Spring boot项目(一),主要是spring boot集成mybat ...

  7. Spring Boot 入门(七):集成 swagger2

    本片文章是基于前一篇写的,<Spring Boot 入门(六):集成 treetable 和 zTree 实现树形图>,本篇主要介绍了spring boot集成swagger2.关于swa ...

  8. Spring Boot 入门(八):集成RabbitMQ消息队列

    本片文章续<Spring Boot 入门(七):集成 swagger2>,关于RabbitMQ的介绍请参考<java基础(六):RabbitMQ 入门> 1.增加依赖 < ...

  9. Spring Boot 入门(十一):集成 WebSocket, 实时显示系统日志

    以前面的博客为基础,最近一篇为Spring Boot 入门(十):集成Redis哨兵模式,实现Mybatis二级缓存.本篇博客主要介绍了Spring Boot集成 Web Socket进行日志的推送, ...

随机推荐

  1. .NET Core教程--给API加一个服务端缓存啦

    以前给API接口写缓存基本都是这样写代码: // redis key var bookRedisKey = ConstRedisKey.RecommendationBooks.CopyOne(book ...

  2. Chapter Two

    Web容器配置 ~Tomcat配置 server.port配置了Web容器的端口号 error.path配置了当项目出错时跳转去的页面 session.timeout配置了session失效的时间 c ...

  3. <深度学习优化策略-3> 深度学习网络加速器Weight Normalization_WN

    前面我们学习过深度学习中用于加速网络训练.提升网络泛化能力的两种策略:Batch Normalization(Batch Normalization)和Layer Normalization(LN). ...

  4. python matplotlib生成图形

    y=2x+3 import matplotlib.pyplot as plt#约定俗成的写法plt #首先定义两个函数(正弦&余弦) import numpy as np #plt.figur ...

  5. gisoracle做windows界面

    import tkinter as tk from tkinter import messagebox # 设置窗口居中 def window_info(): ws = window.winfo_sc ...

  6. arcpy模块下的并行计算与大规模数据处理

    一个多星期的时间,忍着胃痛一直在做GIS 540: Spatial Programming的课程项目,导致其他方面均毫无进展,可惜可惜.在这个过程当中临时抱佛脚学习了很多Python相关的其他内容,并 ...

  7. response.getWriter().println和@ResponseBody的比较及同时使用(用于回调函数)

    @RequestMapping(value = "/test", method = { RequestMethod.GET, RequestMethod.POST }) @Resp ...

  8. Communications link failure due to underlying exception: ** BEGIN NESTED EXC

    一是将 wait_timeout=31536000 interactive_timeout=31536000 将过期时间修改为1年. 二是在连接URL上添加参数:&autoReconnect= ...

  9. GB28181技术基础之3 - RTP

    一. RTP协议 实时传输协议 RTP(Real-time Transport Protocol)是一个网络传输协议,它是由IETF的多媒体传输工作小组1996年在RFC 1889中公布的,后在RFC ...

  10. npm配置淘宝镜像

    npm直接安装包太慢,采用淘宝npm镜像安装 在linux和Mac上可以添加环境变量的形式修改bashrc文件,但是在windows上可以直接采取如下方式,以绝后患. 永久采用 npm config ...