Quartz的简单使用。
1、Java定时器任务调度工具Quartz(纯java编写,十分强大)。由OpenSymphony提供的强大开源任务调度框架。官方网址:http://www.quartz-scheduler.org
特点:a、强大的调度功能。b、灵活的应用方式。3、分布式和集群能力。
设计模式:a、Builder模式(JobDetail、Trigger)。b、Factory模式(调度器)。c、组件模式(可插拔哦,耦合度低)。d、链式写法(十分好使哦,超喜欢呢)。
2、Quartz的三个核心概念。
a、调度器(负责定期,定时,定频率的去执行调度任务)。
b、任务(就是自己开发的业务逻辑)。
c、触发器(就是时间,Trigger)。
3、Quartz的体系结构。
a、JobDetail(包含了任务的实现类以及类的信息)。
b、Trigger(就是触发器,决定了任务什么适合被调用)。Trigger分为两种,分别是SimpleTrigger和CronTrigger(功能更强大)。
c、Scheduler(调度器,定时,顶频率执行jobDetail)。有start方法、stop方法、pause方法、resume方法。等等方法。
4、Quartz的重要组成。
a、Job接口,只有一个方法execute(),此方法里面实现的就是自己的业务逻辑。JobExecutionContext参数可以进行调度上下文的各种信息。
b、JobDetail,Quartz在每次执行job的时候就会重新创建一个job实例,所以Quartz不节制直接接受一个job实例,相反,它接受一个job实现类,以便运行时通过new Instance()的反射机制实例化job,因此需要通过一个类来描述这个job实现类以及其他相关的静态信息,如job的名称,所在组,描述,关联监听器等等信息。
c、JobBuilder用户创建JobDetail实例。
d、JobStore,是一个接口。用来保存job数据的。
e、Trigger,是一个类,用来描述时间触发规则。
f、TriggerBuilder,用来定义或者创建触发器的实例的。
g、ThreadPool。线程池,Quartz有这个线程池在执行。
h、Scheduler调度器。代表Quartz独立运行的容器。可以将JobDetail和Trigger进行组合。其两者都有自己的名称和所在组。
i、 Calender,一个Trigger可以和多个Calendar关联,以排除或包含某些时间点。
j、监听器,jobListener,TriggerListener,SchedulerListener。
Quartz代码练习使用。
1、创建maven工程,然后引入Quartz的jar包。
1 <project xmlns="http://maven.apache.org/POM/4.0.0" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 6 <groupId>com.bie</groupId> 7 <artifactId>HelloQuartz</artifactId> 8 <version>0.0.1-SNAPSHOT</version> 9 <packaging>jar</packaging> 10 11 <name>HelloQuartz</name> 12 <url>http://maven.apache.org</url> 13 14 <properties> 15 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 16 </properties> 17 18 <dependencies> 19 <dependency> 20 <groupId>junit</groupId> 21 <artifactId>junit</artifactId> 22 <version>3.8.1</version> 23 <scope>test</scope> 24 </dependency> 25 <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz --> 26 <dependency> 27 <groupId>org.quartz-scheduler</groupId> 28 <artifactId>quartz</artifactId> 29 <version>2.2.1</version> 30 </dependency> 31 </dependencies> 32 </project>
2、然后创建一个HelloJob,实现Job接口,编写自己的业务逻辑。Job定义,实现业务逻辑的任务接口。
Job实例在Quartz中的生命周日,每次调度器执行job的时候,它在调用execute方法前会创建一个新的job实例。当调用完成后,关联的job对象实例会被释放,释放的实例会被垃圾回收机制回收。
JobExecutionContext,当Scheduler调用一个job,就会将JobExecutionContext传递给job的execute()方法。job能通过JobExecutionContext对象访问到Quartz运行时候的环境以及job本身的明细数据。
1 package com.bie.HelloQuartz; 2 3 import java.text.SimpleDateFormat; 4 import java.util.Date; 5 6 import org.quartz.Job; 7 import org.quartz.JobExecutionContext; 8 import org.quartz.JobExecutionException; 9 10 /** 11 * 12 * @Description TODO 13 * @author biehl 14 * @Date 2019年9月6日 上午11:55:09 15 * 16 * 首先需要定义一个Quarta的job作业 17 */ 18 public class HelloJob implements Job { 19 20 /** 21 * 实现Job接口的类,需要实现job接口里面的方法。 22 * 23 * execute方法是需要执行的业务逻辑。 24 */ 25 public void execute(JobExecutionContext arg0) throws JobExecutionException { 26 // 打印当前的执行时间,格式为2019-09-06 00:00:00 27 Date date = new Date(); 28 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 29 System.out.println("Current Exec Time is : " + sdf.format(date)); 30 // 编写具体的业务逻辑。根据自己的需求进行修改即可。 31 System.out.println("hello world !!! Quartz"); 32 } 33 34 }
3、然后实现自己的调度器,首先JobDetail和自己的Job绑定,然后定义好时间Trigger,最后使用Scheduler调度器将JobDetail和Trigger结合到一起。
JobDetail为Job实例提供了许多设置属性,以及JobDataMap成员变量属性,它用来存储特定job实例的状态信息,调度器需要借助JobDetail对象来添加Job实例。
JobDataMap,在进行任务调度时JobDataMap存储在JobExecutionContext中,非常方便获取。JobDataMap可以用来装载任何可序列化的数据对象,当job实例对象被执行时这些参数对象会传递给它。JobDataMap实现了jdk的map接口,并且添加了一些非常方便的方法用来存取基本数据类型。
Trigger中是Quartz中的触发器,用来告诉调度程序作业什么时候触发,即Trigger对象是用来触发执行job的。
1 package com.bie.HelloQuartz; 2 3 import java.text.SimpleDateFormat; 4 import java.util.Date; 5 6 import org.quartz.JobBuilder; 7 import org.quartz.JobDetail; 8 import org.quartz.Scheduler; 9 import org.quartz.SchedulerException; 10 import org.quartz.SchedulerFactory; 11 import org.quartz.SimpleScheduleBuilder; 12 import org.quartz.Trigger; 13 import org.quartz.TriggerBuilder; 14 import org.quartz.impl.StdSchedulerFactory; 15 16 /** 17 * 18 * @Description TODO 19 * @author biehl 20 * @Date 2019年9月6日 上午11:59:33 21 * 22 * 测试Quartz的主类 23 * 1、定义自己的job,编辑的是自己的业务逻辑。 24 * 2、定义JobDetail,其中JobDetail用于来绑定自己的job作业。 25 * 3、定义Trigger。需要创建一个SimpleScheduleBuilder,这个用于定义执行的时间,是否重复等等时间要素。 26 * 4、定义Scheduler。通过工厂模式创建,用于绑定自己的jobDetail和trigger。 27 * 28 */ 29 public class HelloScheduler { 30 31 public static void main(String[] args) { 32 // 创建一个JobDetail实例,将该实例与HelloJob Class进行绑定 33 JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob1", "group1").build(); 34 // 创建一个Trigger实例,该实例用于触发job去执行。什么适合执行,多长时间执行一次,是否重复执行。 35 SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2) 36 .repeatForever(); 37 Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1").startNow() 38 .withSchedule(simpleScheduleBuilder).build(); 39 // 创建schedule实例,工厂方法,创建schedule 40 SchedulerFactory schedulerFactory = new StdSchedulerFactory(); 41 try { 42 Scheduler scheduler = schedulerFactory.getScheduler(); 43 scheduler.start(); 44 scheduler.scheduleJob(jobDetail, trigger); 45 } catch (SchedulerException e) { 46 // TODO Auto-generated catch block 47 e.printStackTrace(); 48 } 49 50 // 打印当前的时间,格式为2019-09-06 00:00:00 51 Date date = new Date(); 52 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 53 System.out.println("Current Time is : " + sdf.format(date)); 54 } 55 }
执行效果如下所示:
待续.......
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?