文章目录
- 前言
- 一、实现一个Quartz的小案例
- 1.创建一个maven项目
- 2.添加Quartz依赖
- 3.创建一个配置文件配置Quartz信息
- 4.创建一个Job类继承Job接口
- 5.编写主方法逻辑进行测试
- 6.测试运行结果
- 二、Job和JobDetail
- 总结
前言
目前仍有大部分企业仍在使用Quartz这种定时任务框架,它也是功能比较强大的一种定时任务框架,它与ElasticJob的主要区别在于它不支持分布式,它是一种任务只在单个服务器上运行,而ElasticJob可以使用分片策略去执行任务,接下来我们将由浅入深去了解它。
一、实现一个Quartz的小案例
1.创建一个maven项目
点击create创建即可
2.添加Quartz依赖
在pom.xml文件中加上quartz的依赖,任意选择一个版本
<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.1</version>
</dependency>
3.创建一个配置文件配置Quartz信息
新建一个quartz.propertis配置文件进行如下配置:
org.quartz.scheduler.instanceName=myScheduler,是指任务调度器的实例名称,
org.quartz.threadPool.threadCount=3,是指配置的线程池中的线程数量,意思是当前定时任务中允许多少个任务同时执行
org.quattz.jobStore.class=org.quartz.simpl.RAMJobStore,这是配置Job存储的形式,一般有两种,一种是存储在数据库中,另一种是内存中,这里我们配置存储在内存
4.创建一个Job类继承Job接口
删除项目自动生成的App文件,新建一个job的包,再新建一个MyJob类继承Job接口,然后打印一句话和对应的执行时间
public class MyJob implements Job {@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {LocalTime localTime = LocalTime.now();System.out.println("我正在执行!" + localTime.toString());}
}
5.编写主方法逻辑进行测试
新建一个测试类,类名为QuartzDemo,在主方法中编写业务逻辑
public class QuartzDemo {public static void main(String[] args) throws SchedulerException, InterruptedException {Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();scheduler.start();JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity("jobDetail1", "group1").build();Trigger trigger = TriggerBuilder.newTrigger().startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).repeatForever()).build();scheduler.scheduleJob(jobDetail, trigger);Thread.sleep(600000);scheduler.shutdown();}
}
在main方法中主要定义了JobDetail的名称与分组,以及按照触发器规则运行,以上配置的触发器规则为立即执行,间隔10s,以及永远执行等规则。然后将job和trigger注册到scheduler当中来,使job按照触发器的规则去运行,当trigger被触发以后,会调用和trigger关联的JobDetail,程序会执行JobDetail当中的execute方法,execute方法会调用程序中的一个工作线程去调用Job实例,这个工作线程就是我们在配置文件中配置的threadCount
6.测试运行结果
二、Job和JobDetail
Job仅仅表明Job需要完成什么样的任务,只要把任务逻辑写在Job的实现类当中,Job实例的其他属性由JobDetail完成,在Job实现类中,execute方法的参数JobExecutionContext对象包含了Job运行时的一些信息,首先是JobScheduler的应用,还有Trigger最后是JobDetail信息。在我们创建JobDetail的时候,会将Job的类名传入到JobDetail,所以scheduler就知道要执行什么类型的Job,每次scheduler要执行Job之前在执行executer方法之前会创建Job的实例,因此Job必须有一个无参的构造函数,而且实例变量是无法传递的,因为每次都会重新实例化,新创建的实例被执行完后就会被丢弃了,就是会被GC垃圾回收
在Job实现类中可以定义一些获取任务运行过程中的一些信息:
测试结果如下:
当我定义了一个带参数的构造函数时,将不会执行任务,除非有一个无参的构造函数
当我们再加上一个无参构造函数,对实例变量进行++操作,如下图:
每次任务执行i都是1,每次执行都会实例化,i的值没有传递。
总结
本篇使用了一个案例让我们大概了解Quartz定时任务的运行规则与实现原理,下面我会继续分享Quart在实际工作中的应用场景。