第一个Quartz程序

目的

搭建一个Quartz项目,完成如下需求:

每两秒钟打印一次Hello World

搭建Quartz项目

这里搭建的是一个Maven构建的项目,所以需要有一定的Mavan知识。

  1. 搭建一个Maven项目
  2. 在依赖中加入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>
  3. 创建一个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");
        }
    }
  4. 创建类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();
        }
    }
  5. 执行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关键在于JobJobDetailTriggerScheduler
Job抽象了要完成的任务,所以需要实现接口Job,在execute方法种编写具体的工作内容。比如上面实例的输出Helllo World
除了要完成的工作,还需要定义什么时候执行程度。上面示例的要求是:每两秒,我们这里进行设计就是:程序启动时就执行一次任务,然后每过两秒钟再次执行任务。程序如下所示:

            Trigger trigger = TriggerBuilder
                    .newTrigger()
                    .withIdentity("myTrigger", "group")
                    .startNow()
                    .withSchedule(
                            SimpleScheduleBuilder
                                    .simpleSchedule()
                                    .repeatForever()
                                    .withIntervalInSeconds(2)
                    ).build();

定义了要完成的工作和触发的条件,那么这两个东西如何能够进行调度呢,比如说,每过两秒,trigger触发一次,如何知道去执行哪一个工作呢。这时候就需要Scheduler,由它来进行调度。

猜你喜欢

转载自blog.csdn.net/wang465745776/article/details/80384089