Quartz 入门(1)(1)

本文介绍了Quartz框架中的Scheduler、Trigger、JobDetail、StatefulJob等核心概念,强调了任务的执行模式(有状态与无状态)、线程池的使用以及事件监听系统的重要性。还讨论了如何在Quartz中管理任务数据和持久化策略。
摘要由CSDN通过智能技术生成

<5>. Scheduler: 代表一个Quartz的独立运行容器, Trigger和JobDetail可以注册到Scheduler中, 两者在Scheduler中拥有各自的组及名称, 组及名称是Scheduler查找定位容器中某一对象的依据, Trigger的组及名称必须唯一, JobDetail的组和名称也必须唯一(但可以和Trigger的组和名称相同,因为它们是不同类型的)。Scheduler定义了多个接口方法, 允许外部通过组及名称访问和控制容器中Trigger和JobDetail。

Scheduler可以将Trigger绑定到某一JobDetail中, 这样当Trigger触发时, 对应的Job就被执行。一个Job可以对应多个Trigger, 但一个Trigger只能对应一个Job。可以通过SchedulerFactory创建一个Scheduler实例。Scheduler拥有一个SchedulerContext,它类似于ServletContext,保存着Scheduler上下文信息,Job和Trigger都可以访问SchedulerContext内的信息。SchedulerContext内部通过一个Map,以键值对的方式维护这些上下文数据,SchedulerContext为保存和获取数据提供了多个put()和getXxx()的方法。可以通过Scheduler# getContext()获取对应的SchedulerContext实例;

6. ThreadPool: Scheduler使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程提高运行效率。

Job有一个StatefulJob子接口,代表有状态的任务,该接口是一个没有方法的标签接口,其目的是让Quartz知道任务的类型,以便采用不同的执行方案。无状态任务在执行时拥有自己的JobDataMap拷贝,对JobDataMap的更改不会影响下次的执行。而有状态任务共享共享同一个JobDataMap实例,每次任务执行对JobDataMap所做的更改会保存下来,后面的执行可以看到这个更改,也即每次执行任务后都会对后面的执行发生影响。

正因为这个原因,无状态的Job可以并发执行,而有状态的StatefulJob不能并发执行,这意味着如果前次的StatefulJob还没有执行完毕,下一次的任务将阻塞等待,直到前次任务执行完毕。有状态任务比无状态任务需要考虑更多的因素,程序往往拥有更高的复杂度,因此除非必要,应该尽量使用无状态的Job。

如果Quartz使用了数据库持久化任务调度信息,无状态的JobDataMap仅会在Scheduler注册任务时保持一次,而有状态任务对应的JobDataMap在每次执行任务后都会进行保存。

Trigger自身也可以拥有一个JobDataMap,其关联的Job可以通过JobExecutionContext#getTrigger().getJobDataMap()获取Trigger中的JobDataMap。不管是有状态还是无状态的任务,在任务执行期间对Trigger的JobDataMap所做的更改都不会进行持久,也即不会对下次的执行产生影响。

Quartz拥有完善的事件和监听体系,大部分组件都拥有事件,如任务执行前事件、任务执行后事件、触发器触发前事件、触发后事件、调度器开始事件、关闭事件等等,可以注册相应的监听器处理感兴趣的事件。

下图描述了Scheduler的内部组件结构,SchedulerContext提供Scheduler全局可见的上下文信息,每一个任务都对应一个JobDataMap,虚线表达的JobDataMap表示对应有状态的任务:

2.入门程序

======

2.1先准备环境


Maven普通工程,在pom.xml中引入 Quartz  jar包  版本:2.2.3

org.quartz-scheduler

quartz

2.2.3

结构如图所示:

2.2 HelloJob.java代码


/**

  • @author Merlin

  • @version 1.0.0

  • @filename HelloJob.java

  • @time 2017年7月7日 下午8:14:11

  • @copyright© 2017

*/

package com.merlin.quertz;

import java.text.SimpleDateFormat;

import java.util.Date;

import org.quartz.Job;

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;

/**

  • Quertz入门一

*实现每隔2秒打印一次 Hello Word

  • @see

  • @since

*/

public class HelloJob implements Job {

@Override

public void execute(JobExecutionContext arg0) throws JobExecutionException {

//打印当前执行时间

SimpleDateFormat sdf = new SimpleDateFormat(“YYYY-MM-HH:hh:mm:ss”);

Date date = new Date();

System.out.println("current exec is time: "+sdf.format(date));

//编写具体的业务逻辑

System.out.println(“Hello Word!”); //打印Hello Word!

}

}

2.3 HelloScheduler.java代码


  • @author Merlin

  • @version 1.0.0

  • @filename HelloScheduler.java

  • @time 2017年7月7日 下午8:21:14

  • @copyright© 2017

*/

package com.merlin.quertz;

import java.text.SimpleDateFormat;

import java.util.Date;

import org.quartz.JobBuilder;

import org.quartz.JobDetail;

import org.quartz.Scheduler;

import org.quartz.SchedulerException;

import org.quartz.SchedulerFactory;

import org.quartz.SimpleScheduleBuilder;

import org.quartz.Trigger;

import org.quartz.TriggerBuilder;

import org.quartz.impl.StdSchedulerFactory;

/**

  • Quertz入门一

  • @see

  • @since

*/

public class HelloScheduler {

public static void main(String[] args) throws SchedulerException {

// 创建一个JobDetail实例,将该实例与HelloWord Class绑定

JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity(“myjob”, “group1”).build();

// 创建一个Trigger实例,定义该Job立即执行,并且每隔两秒钟重复执行一次,直到永远

Trigger trigger = TriggerBuilder.newTrigger().withIdentity(“mytigger”, “group1”) // 这个group1跟上面的group1无关,属于不同的类

.startNow()

.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever())

.build();

// 创建Scheduler实例

SchedulerFactory sfact = new StdSchedulerFactory();

Scheduler scheduler = sfact.getScheduler();

scheduler.start();

// 打印当前执行时间 时间格式为:2017-07-20:08:32:41

SimpleDateFormat sdf = new SimpleDateFormat(“YYYY-MM-HH:hh:mm:ss”);

Date date = new Date();

System.out.println("current exec is time: " + sdf.format(date));

scheduler.scheduleJob(jobDetail, trigger);// 将jobDetail 和tigger绑定在一起。

}

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

给大家送一个小福利

附高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
" alt=“img” style=“zoom: 33%;” />

最后

给大家送一个小福利

[外链图片转存中…(img-ImsJ1FXj-1713272213403)]

附高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。

[外链图片转存中…(img-JfXXF8op-1713272213403)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值