六、springboot2.x整合Quartz实现定时调度任务

一、先介绍下Quartz

  1. 简介
    起初是OpenSymphony组织提供的一个功能丰富的开源作业调度框架
    官网:http://www.quartz-scheduler.org/
    纯java编写,用法简单而功能强大

  2. 特点
    1.、强大的作业调度功能
    作为spring默认的调度框架,极易与spring无缝整合,实现灵活可配置的调度功能,quartz提供了调 度运行环境持久化机制,可以保存并恢复调度现场,即使系统因故障关闭也不会造成调度现场的数据丢失。
    2、 灵活的应用方式
    允许我们灵活定义触发器的调度时间规则,并可以将触发器与任务进行关联绑定,quartz提供了主键式的监听器,各种插件以及线程池等功能,支持任务和调度的多重组合,支持调度数据的多种存储方式。
    3、 分布式和集群能力
    Quartz 集群中的每个节点是一个独立的 Quartz 应用,需要对每个节点分别启动或停止。不像许多应用服务器的集群,独立的 Quartz 节点并不与其他的节点或是管理节点通信。Quartz 应用是通过数据库表来感知到另一应用的。

  3. 核心结构
     job(或task)是实现定时功能的接口:如定时推送消息等。
     trigger是触发执行定时任务的触发器,基本设置有:指定job的运行时间,时间间隔,运行次数等。
     schedule是调度指定的trigger去执行指定的job。
    六、springboot2.x整合Quartz实现定时调度任务_第1张图片
    二、集成与使用步骤

  • 集成quartz的两种方式说明
    spring使用quartz大致有2种方式:一是任务类继承QuartzJobBean,二是在xml文件里定义任务类和要执行的方法,为了简化配置和快速开发,一般使用第一种较多。

  • 引入相关依赖



      org.springframework.boot
       spring-boot-starter-quartz

  • 定义任务类
    继承QuartzJobBean,重写excuteInternal方法
@Component
public class HelloTask extends QuartzJobBean {

    private static final Logger logger = LoggerFactory.getLogger(HelloTask.class);

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        //  这里写调用执行定时调度任务的逻辑
        logger.info("------天青色等烟雨-------" + new Date());
    }
}
  • 定义配置类
    在配置类中定义JobDetail和SimpleTrigger。
@Configuration
public class TaskConfig {

    // 定义要执行的HelloTask任务类
    @Bean
    public JobDetail helloJobDetail() {
        return JobBuilder.newJob(HelloTask.class).withIdentity("hellohello").storeDurably().build();
    }

    // Simple触发器定义与设置
    @Bean
    public SimpleTrigger sayHelloBySimpleTrigger(){
        // Simple类型:可设置时间间隔、是否重复、触发频率(misfire机制)等
        SimpleScheduleBuilder ssb = SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(5).repeatForever();

        // 一个Trigger只对应一个Job,Schedule调度器调度Trigger执行对应的Job
        SimpleTrigger sTrigger = TriggerBuilder.newTrigger().forJob(helloJobDetail()).
                withIdentity("helloSimpleTrigger").withDescription("simple类型的触发器").withSchedule(ssb).build();
        return sTrigger;
    }
}

当然,上面是一个简单的触发器SimpleTrigger ,经常使用的还有CronTrigger。

// Cron触发器定义与设置
    @Bean
    public CronTrigger sayHelloByCronTrigger(){
        // Cron类型:通过cron表达式设置触发规则
        CronScheduleBuilder csb = CronScheduleBuilder.cronSchedule(String.format("0 */1 * * * ?"))
                .withMisfireHandlingInstructionDoNothing();

        // 一个Trigger只对应一个Job,Schedule调度器调度Trigger执行对应的Job
        CronTrigger cTrigger = TriggerBuilder.newTrigger().forJob(helloJobDetail()).
                withIdentity("helloCronTrigger").withDescription("corn类型的触发器").withSchedule(csb).startNow().build();
        return cTrigger;
    }

三、测试一下

启动DemoApplication,观察控制台输出
SimpleTrigger设置的是5秒执行一次:
六、springboot2.x整合Quartz实现定时调度任务_第2张图片
CronTrigger设置的是一分钟执行一次:
在这里插入图片描述
四、总结一下

集成quartz和使用它是很简单的,抓住Job,Trigger,Schedule三大核心对象就可以玩转quartz了。

另外corn表达式也是经常会用的一个点,有关corn的组成规则,线上验证工具可以参考下面的路径:

  1. corn学习:https://blog.csdn.net/weixin_40426638/article/details/78959972
  2. 在线生成corn表达式工具:http://cron.qqe2.com/

你可能感兴趣的:(springboot2)