因为某篇大牛文章推荐了所谓十个 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)方法。 因此,有必要去看看它的实现代码片段:
最终必然有某处具有线程循环的方式用于监听。 更多的表现方式应该是子线程。 更多代码等以后有机会再看吧!