认识企业级定时任务Quartz

文章目录

  • 前言
  • 一、实现一个Quartz的小案例
    • 1.创建一个maven项目
    • 2.添加Quartz依赖
    • 3.创建一个配置文件配置Quartz信息
    • 4.创建一个Job类继承Job接口
    • 5.编写主方法逻辑进行测试
    • 6.测试运行结果
  • 二、Job和JobDetail
  • 总结


前言

目前仍有大部分企业仍在使用Quartz这种定时任务框架,它也是功能比较强大的一种定时任务框架,它与ElasticJob的主要区别在于它不支持分布式,它是一种任务只在单个服务器上运行,而ElasticJob可以使用分片策略去执行任务,接下来我们将由浅入深去了解它。


一、实现一个Quartz的小案例

1.创建一个maven项目

认识企业级定时任务Quartz_第1张图片
认识企业级定时任务Quartz_第2张图片
点击create创建即可

2.添加Quartz依赖

认识企业级定时任务Quartz_第3张图片
在pom.xml文件中加上quartz的依赖,任意选择一个版本

<dependency>
      <groupId>org.quartz-schedulergroupId>
      <artifactId>quartzartifactId>
      <version>2.3.1version>
dependency>

3.创建一个配置文件配置Quartz信息

新建一个quartz.propertis配置文件进行如下配置:
org.quartz.scheduler.instanceName=myScheduler,是指任务调度器的实例名称,
org.quartz.threadPool.threadCount=3,是指配置的线程池中的线程数量,意思是当前定时任务中允许多少个任务同时执行
org.quattz.jobStore.class=org.quartz.simpl.RAMJobStore,这是配置Job存储的形式,一般有两种,一种是存储在数据库中,另一种是内存中,这里我们配置存储在内存

认识企业级定时任务Quartz_第4张图片

4.创建一个Job类继承Job接口

删除项目自动生成的App文件,新建一个job的包,再新建一个MyJob类继承Job接口,然后打印一句话和对应的执行时间

public class MyJob implements Job {
    @Override
    public 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.测试运行结果

认识企业级定时任务Quartz_第5张图片

二、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垃圾回收

认识企业级定时任务Quartz_第6张图片
在Job实现类中可以定义一些获取任务运行过程中的一些信息:
测试结果如下:
认识企业级定时任务Quartz_第7张图片
当我定义了一个带参数的构造函数时,将不会执行任务,除非有一个无参的构造函数
认识企业级定时任务Quartz_第8张图片
当我们再加上一个无参构造函数,对实例变量进行++操作,如下图:
认识企业级定时任务Quartz_第9张图片
认识企业级定时任务Quartz_第10张图片
每次任务执行i都是1,每次执行都会实例化,i的值没有传递。


总结

本篇使用了一个案例让我们大概了解Quartz定时任务的运行规则与实现原理,下面我会继续分享Quart在实际工作中的应用场景。

你可能感兴趣的:(Quartz,Java)