Quartz
特点:
强大的调度功能,即使系统挂掉,也不会丢失消息
灵活的应用方式:提供线程池,支持调度的多种存储方式等
分布式和集群的能力
Quartz设计模式
Builder设计模式构建
Factory模式创建
组件模式。易于扩展,可插拔
链式写法
三个核心概念
Trigger 触发器。负责定时定频率输出任务
JobDetail 任务 :也就是所调度实现的方法块
Scheduler 调度器,让任务生效的调度
trigger 触发器。 simpleTrigger 单词执行能够执行,时间上面的操作
CronTrigger。更复杂的任务触发,多次或者复杂触发
job Detail 包含任务的实现类。
Scheduler 通过Schedule 进行处理
Quartz的体系结构
重要组成
Scheduler:与调度器交互的主要API。
Job:一个接口,实现该接口的组件将被调度器运行。
JobDetail:用于定义Job实例。
Trigger:定义了一个Job如何被调度器所运行。
JobBuilder:用于定义/构建JobDetail 实例。
TriggerBuilder:用于定义/构建Trigger实例。
maven依赖链接: Quartz.
详情看备注 StdSchedouler执行
上图
上代码
package com.SpringTest.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 〈一句话功能简述〉<br>
* 〈功能详细描述〉
*
* @author 88450572
* @date 2019/11/12 9:34
* @see [相关类/方法](可选)
* @since [产品/模块版本] (可选)
*/
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//打印当前执行时间 格式为 yyyy-MM-dd HH:mm:ss
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//编写具体业务逻辑
System.out.println("当前时间为 :"+simpleDateFormat.format(date));
System.out.println("Hello -- word ");
}
}
package com.SpringTest.quartz;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 〈一句话功能简述〉<br>
* 〈功能详细描述〉
*
* @author 88450572
* @date 2019/11/12 9:52
* @see [相关类/方法](可选)
* @since [产品/模块版本] (可选)
*/
public class MyScheduler {
public static void main(String[] args) throws SchedulerException {
// todo 创建JobDetail
// 实例化Detail Job 细节:Builder Job. withidentity 传入参数Job 命名 myJob Job分组 Group1
JobDetail jobDetail = JobBuilder
// 实例MyJob任务
.newJob(MyJob.class)
// 和名字是 my Job 组是 Group1
.withIdentity("myJob", "group1")
// 构建
.build();
// todo 创建Trigger 触发器实例
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("myTrigger", "group1")
//立即执行
.startNow()
// 执行安排计划
.withSchedule(SimpleScheduleBuilder
.simpleSchedule()
// 每隔两秒执行一次(单位秒)
.withIntervalInSeconds(2)
// 永远执行下去
.repeatForever())
// 构建
.build();
// todo 创建StdSchedulerFactory 实例
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
// 获取实例
Scheduler scheduler = schedulerFactory.getScheduler();
// 计划执行
scheduler.start();
//打印当前执行时间 格式为 yyyy-MM-dd HH:mm:ss
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("当前执行时间为 :"+simpleDateFormat.format(date));
// 执行job 执行触发器 和 job实例
scheduler.scheduleJob(jobDetail,trigger);
}
}
执行结果
JobDataMap
package com.SpringTest.quartz;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import java.text.SimpleDateFormat;
import java.util.Date;
import static org.quartz.JobBuilder.newJob;
/**
* 〈一句话功能简述〉<br>
* 〈功能详细描述〉
*
* @author 88450572
* @date 2019/11/12 17:47
* @see [相关类/方法](可选)
* @since [产品/模块版本] (可选)
*/
public class MyDateScheduler {
public static void main(String[] args) throws SchedulerException {
JobDetail job = newJob(MyDateJob.class)
.withIdentity("myJob", "group1") // name "myJob", group "group1"
.usingJobData("jobSays", "Hello World!")
.usingJobData("myFloatValue", 3.141f)
.build();
// todo 创建Trigger 触发器实例
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("myTrigger", "group1")
//立即执行
.startNow()
// 执行安排计划
.withSchedule(SimpleScheduleBuilder
.simpleSchedule()
// 每隔两秒执行一次(单位秒)
.withIntervalInSeconds(2)
// 永远执行下去
.repeatForever())
// 构建
.build();
// todo 创建StdSchedulerFactory 实例
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
// 获取实例
Scheduler scheduler = schedulerFactory.getScheduler();
// 计划执行
scheduler.start();
//打印当前执行时间 格式为 yyyy-MM-dd HH:mm:ss
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("当前执行时间为 :" + simpleDateFormat.format(date));
// 执行job 执行触发器 和 job实例
scheduler.scheduleJob(job, trigger);
}
}
package com.SpringTest.quartz;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
/**
* 〈一句话功能简述〉<br>
* 〈功能详细描述〉
*
* @author 88450572
* @date 2019/11/12 17:45
* @see [相关类/方法](可选)
* @since [产品/模块版本] (可选)
*/
public class MyDateJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobKey key = jobExecutionContext.getJobDetail().getKey();
JobDataMap dataMap = jobExecutionContext.getJobDetail().getJobDataMap();
String jobSays = dataMap.getString("jobSays");
float myFloatValue = dataMap.getFloat("myFloatValue");
System.err.println("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue);
}
}