1. Quartz介绍
任务调度框架“Quartz”是OpenSymphony开源组织在Job scheduling领域又一个开源项目,是完全由java开发的一个开源的任务日程管理系统
简单来说就是一个定时任务系统
quartz的应用场景大致分为两类
定时定点完成某一操作(数据库操作)
遵循某一规律,循环执行某一操作
五种类型的Trigger(定时器) 最常用的是前面两个触发器
SimpleTrigger,CronTirgger,DateIntervalTrigger,NthIncludedDayTrigger和Calendar类( org.quartz.Calendar)。
下面就来玩一个简单定时任务。
首先创建spring boot项目 勾选quartz的依赖 另外还需要另外一个pom依赖
这个是springboot创建有的
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
后面这个是需要另外导入的
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
然后创建一个类 实现job类
public class RamJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("定时任务启动。。。");
JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();//获取到那边的值
System.out.println(jobDataMap.get("name") + "" + jobDataMap.get("a1") + "" + jobDataMap.get("a2"));
}
}
最后进行测试 每步操作都有备注 运行就能看到触发器触发的设置
总结来说就是创建一个实例机制 然后得到调动器 用调度器来把作业类和触发器里面的设置组装起来 最后启动就可以了。
public class Demo {
public static void main(String[] args) throws SchedulerException {
SchedulerFactory sf=new StdSchedulerFactory();//提供程序实例的机制
Scheduler scheduler=sf.getScheduler();//调度器 调度JobDetail和触发器
//new一个作业类 里面放了那个需要定时的类
JobDetail jobDetail=newJob(RamJob.class)
.withIdentity("job1","group1")//唯一标识
.withDescription("is job")//给一个名字
.usingJobData("name","zs")//第一种设置参数值
.build();
JobDataMap jobDataMap=jobDetail.getJobDataMap();//第二种用map获取
jobDataMap.put("a1","hh");
jobDataMap.put("a2","ls");
//触发器
Trigger trigger= (Trigger) TriggerBuilder.newTrigger()
//简单重复去执行某一操作 比如执行3此五秒一次 简单定时器
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(3,5))
//表达式触发器 比如在12点04分触发 "0/5 * * * * ?"每五秒钟执行一次
// .withSchedule(CronScheduleBuilder.cronSchedule("0 04 12 * * ?"))
.withIdentity("trigger1","group1")
.withDescription("这是 tigger").build();
scheduler.scheduleJob(jobDetail,trigger);//把两个类组装起来
scheduler.start();//最后启动调动器
}
}
上面说到了两种触发器 一种简单触发器重复去执行某一操作
表达式触发器设置在某个时间触发 还有其他一些值 比如几秒执行一次等
下面有很多的设置都可以参考
最后在说一下spring自带的定时任务管理
要用service表示被spring管理 运行时要在主程序类里加上
@EnableScheduling//扫描包定时任务 注解
使用方便 但是单线程的 只能一个一个执行
@Service
public class SpringScheduled {
//spring自带定时任务无需整合 给一个注解表明被spring管理 依赖的service层可直接注入当前任务类 quertz不能
//缺点:spring task是单线程 只能一个一个执行 不能像quertz那样
@Scheduled(cron = "0/5 * * * * ?")//每五秒执行一次 加上此注解即可 主程序类里需要加一个注解
public void aaa(){
System.out.println("spring的定时任务");
}
}
大概的对比就在这里 可自行参考一下。