认识企业级定时任务Quartz


前言

目前仍有大部分企业仍在使用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 {
    @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.测试运行结果

在这里插入图片描述

二、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的值没有传递。

三、使用JobDataMap进行参数传递

1.使用context上下文获取参数信息

在这里插入图片描述
在客户端我们可以使用usingJobData方式传入一个键值对参数,然后在Job类中的JobExecutionContext上下文中可以获取到这个参数
在这里插入图片描述
控制台打印如下:
在这里插入图片描述

2.定义实例变量通过getset方式获取参数信息

在这里插入图片描述

在这里插入图片描述


总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员阿坤...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值