任务调度框架Quartz学习笔记

   因为某篇大牛文章推荐了所谓十个  java程序员必备的15个框架,地址在:这里。  抱着宁可信其有,不可信其无的态度,将其中几个不是很熟悉的内容看一看,并做笔记记录。需要在短时间学的怎么怎么样是不太现实的, 所以简单记录记录。 今天的目标是至少记录三个相关的框架笔记。   第一个:Quartz;

   学习一个框架我觉得包括两点:第一,知道它是干什么的; 第二,知道如何使用;  第三,知道大致的原理。  有什么用,如何使用可以在官方文档上清楚的查到;  大致原理最理想的方法就是调试。 所以下文将以这种思路展开。

1.Quartz是什么:

     直观一点的场景是: 它可以用于定时任务任务的场景中。

2.Quartz如何使用:

     导包什么的那是必需的就不提了,主要看看它如何在项目中使用。

package com.automann;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;

/**
 * @author [email protected]
 * @time 2018/11/25 10:53
 */
public class Main {

    public static void main(String[] args) throws SchedulerException {
        //从工厂中获得调度实例
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        // 开始调度
        scheduler.start();

        // 定义任务并与我们指定的任务类绑定
        JobDetail job = newJob(TheJob.class)
                .withIdentity("job1", "group1")
                .build();

        // 触发任务现在执行,并且每隔40秒执行一次
        Trigger trigger = newTrigger()
                .withIdentity("trigger1", "group1")
                .startNow()
                .withSchedule(simpleSchedule()
                        .withIntervalInSeconds(40)
                        .repeatForever())
                .build();

        //让quartz用我们的触发器去调度任务
        scheduler.scheduleJob(job, trigger);
    }
   public static class TheJob implements Job{
        public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
            System.out.println("hello quartz!");
        }
    }
}

执行结果:

    在实践过程中,有几点需要注意:

          1.任务类必须是public的,且必须包括无参构造;

          2.必须包含日志框架slf4j;  但是要注意,它只是一个标准,而没有具体的实现,因此,至少需要一个它的实现类。  日志框架的具体用法见: java-web环境集成各种主流日志框架(jcl,jul,slf4j,log4j,logback)总结

3.quartz的大致原理:

     在上面实际使用中,涉及到这几个概念:   任务,调度器,触发器;  那么看它的大致原理的时候,便可以从这几个方面入手。

      按照逻辑先后顺序查看:则应该是: 调度器>触发器>任务

     调度器

 

    它的实例默认由工厂环境提供,工厂环境实例的时候的一些代码片段:

之后经过一个大概600行的方法,做了一些环境的初始化。  它最终的结果将会有以下的一些结果:

它的一个核心方法:start()。   看看它在某一个具体的调度器中是如何实现的:

     总之,它的核心应该是开启了一个监听。 根据监听对象的状态做出相应的操作。

  注意到,这个start()方法中并不蕴含类似于while()语句来用于阻塞线程的操作的功能。  它只是单次执行的。  每次执行,就通知一遍注册了的监听器做相应操作。。

  触发器:

   它的实例是通过工厂模式,以及 构造器模式。 通过构造器模式,可以很方便的设置一些参数。  它的所有的动作也只是初始参数。  最终将构造出的实例交给调度器具体执行。   

    调用的是调度的scheduleJob(Job,Trigger)方法。  因此,有必要去看看它的实现代码片段:

   最终必然有某处具有线程循环的方式用于监听。   更多的表现方式应该是子线程。 更多代码等以后有机会再看吧!

猜你喜欢

转载自blog.csdn.net/qq_36285943/article/details/84476073