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。
整合步骤
1、集成quartz的两种方式说明
Spring使用Quartz大致有2种方式:一是任务类继承QuartzJobBean,二是在xml文件里定义任务类和要执行的方法,为了简化配置和快速开发,一般使用第一种较多。
2、pom.xml添加依赖:
<!--定时任务quartz-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
3、定义任务类
// 继承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());
}
}
4、定义配置类
在配置类中定义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;
}
5、测试一下
启动DemoApplication,观察控制台输出
SimpleTrigger设置的是5秒执行一次:
CronTrigger设置的是一分钟执行一次:
总结一下
集成Quartz和使用它是很简单的,抓住Job,Trigger,Schedule三大核心对象就可以玩转Quartz了。
另外corn表达式也是经常会用的一个点,有关corn的组成规则,线上验证工具可以参考下面的路径:
- corn学习可参考:https://blog.csdn.net/weixin_40426638/article/details/78959972
- 在线生成corn表达式工具:http://cron.qqe2.com/