目的
搭建一个Quartz项目,完成如下需求:
每两秒钟打印一次
Hello World
搭建Quartz项目
这里搭建的是一个Maven构建的项目,所以需要有一定的Mavan知识。
- 搭建一个Maven项目
在依赖中加入Quartz的依赖
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.3.0</version> </dependency>
创建一个Job,表示要执行的具体内容,这里就是打印字符串
Hello World
package com.wangguitang.freedom.study.quartz.quartz.job; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HelloJob implements Job { private static Logger logger = LoggerFactory.getLogger(HelloJob.class); @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { logger.info("Hello World"); } }
创建类
HelloScheduler
package com.wangguitang.freedom.study.quartz.quartz; import com.wangguitang.freedom.study.quartz.quartz.job.HelloJob; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; public class HelloScheduler { public static void main(String[] args) throws SchedulerException { // 创建一个JobDetail实例,将该实例与HelloJob进行绑定 JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myjob", "group").build(); // 创建一个Trigger实例,定义该Job立即执行,并且每隔两秒再执行一次 Trigger trigger = TriggerBuilder .newTrigger() .withIdentity("myTrigger", "group") .startNow() .withSchedule( SimpleScheduleBuilder .simpleSchedule() .repeatForever() .withIntervalInSeconds(2) ).build(); // 创建Scheduler实例 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.scheduleJob(jobDetail, trigger); scheduler.start(); } }
执行
HelloScheduler
类的main方法,得到如下结果17:19:36 [INFO ] StdSchedulerFactory:1208 - Using default implementation for ThreadExecutor 17:19:36 [INFO ] SchedulerSignalerImpl:61 - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl 17:19:36 [INFO ] QuartzScheduler:229 - Quartz Scheduler v.2.3.0 created. 17:19:36 [INFO ] RAMJobStore:155 - RAMJobStore initialized. 17:19:36 [INFO ] QuartzScheduler:294 - Scheduler meta-data: Quartz Scheduler (v2.3.0) 'MyScheduler' with instanceId 'NON_CLUSTERED' Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. NOT STARTED. Currently in standby mode. Number of jobs executed: 0 Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 3 threads. Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. 17:19:36 [INFO ] StdSchedulerFactory:1362 - Quartz scheduler 'MyScheduler' initialized from default resource file in Quartz package: 'quartz.properties' 17:19:36 [INFO ] StdSchedulerFactory:1366 - Quartz scheduler version: 2.3.0 17:19:36 [INFO ] QuartzScheduler:547 - Scheduler MyScheduler_$_NON_CLUSTERED started. 17:19:36 [INFO ] HelloJob:14 - Hello World 17:19:38 [INFO ] HelloJob:14 - Hello World 17:19:40 [INFO ] HelloJob:14 - Hello World 17:19:42 [INFO ] HelloJob:14 - Hello World 17:19:44 [INFO ] HelloJob:14 - Hello World 17:19:46 [INFO ] HelloJob:14 - Hello World ...
总结
使用Quartz关键在于Job
、JobDetail
、Trigger
、Scheduler
。
Job
抽象了要完成的任务,所以需要实现接口Job
,在execute
方法种编写具体的工作内容。比如上面实例的输出Helllo World
。
除了要完成的工作,还需要定义什么时候执行程度。上面示例的要求是:每两秒
,我们这里进行设计就是:程序启动时就执行一次任务,然后每过两秒钟再次执行任务。
程序如下所示:
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("myTrigger", "group")
.startNow()
.withSchedule(
SimpleScheduleBuilder
.simpleSchedule()
.repeatForever()
.withIntervalInSeconds(2)
).build();
定义了要完成的工作和触发的条件,那么这两个东西如何能够进行调度呢,比如说,每过两秒,trigger触发一次,如何知道去执行哪一个工作呢。这时候就需要Scheduler
,由它来进行调度。