Quartz入门与Demo搭建

news2024/10/5 1:13:07

一、Quartz简介

	Quartz是OpenSymphony开源组织在Job scheduling领域的一个开源项目,它完全由Java开发,可以用来执行定时
任务。相较于Java自带的java.util.Timer,Quartz增加了很多功能,如持久性作业、丰富的触发器类型等。Quartz可
以集成于任何的Java应用,小到独立的应用,大至电子商务系统,都能够创建简单或复杂的调度,以执行上十、上百,
甚至上万的任务。

二、Quartz的核心组件

1.Scheduler(调度器):
负责整合Job和Trigger,并基于Trigger设定的时间来执行Job。
2.Job(任务):
开发者需要实现的一个接口,其中包含了需要被调度的业务逻辑。
3.JobDetail:
用于定义Job的实例,并为Job实例提供许多属性。每次Scheduler调度执行一个Job的时候,首先会拿到对应的JobDetail,然后创建该Job实例,再去执行Job中的execute()方法的内容。任务执行结束后,关联的Job对象实例会被释放,且会被JVM GC清除。
4.Trigger(触发器):
用于触发执行Job的条件。Trigger定义了一个已经被安排的任务将会在什么时候执行的时间条件。Quartz提供了两种类型的Trigger:SimpleTrigger和CronTrigger。SimpleTrigger主要用于需要重复执行的任务,而CronTrigger则基于Cron表达式,支持更复杂的时间规则。

三、Quartz Demo搭建

以下是一个简单的Quartz Demo,用于演示如何创建一个定时任务。

1.引入Quartz依赖:

如果你使用的是Maven项目,可以在pom.xml文件中添加Quartz的依赖项。例如:

<dependency>  
  <groupId>org.quartz-scheduler</groupId>  
  <artifactId>quartz</artifactId>  
  <version>2.3.2</version>  
</dependency>

2.定义Job类:

创建一个实现Job接口的类,并在其中实现execute()方法。这个方法将包含需要被定时执行的业务逻辑。

import org.quartz.Job;  
import org.quartz.JobExecutionContext;  
import org.quartz.JobExecutionException;  
 
import java.text.SimpleDateFormat;  
import java.util.Date;  
 
public class PrintWordsJob implements Job {  
  @Override  
  public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {  
    String printTime = new SimpleDateFormat("yy-MM-dd HH-mm-ss").format(new Date());  
    System.out.println("PrintWordsJob start at:" + printTime + ", prints: Hello Job-" + new Random().nextInt(100));  
  }  
}

3.创建Scheduler并配置Job和Trigger:

使用SchedulerFactory创建一个Scheduler实例。
使用JobBuilder创建一个JobDetail实例,并与PrintWordsJob类绑定。
使用TriggerBuilder创建一个Trigger实例,并设置触发条件(如每隔1秒执行一次)。
使用Scheduler的scheduleJob方法将JobDetail和Trigger关联起来,并启动Scheduler。

import org.quartz.*;  
import org.quartz.impl.StdSchedulerFactory;  
 
public class MyScheduler {  
  public static void main(String[] args) throws SchedulerException, InterruptedException {  
    // 创建调度器Scheduler  
    SchedulerFactory schedulerFactory = new StdSchedulerFactory();  
    Scheduler scheduler = schedulerFactory.getScheduler();  
 
    // 创建JobDetail实例,并与PrintWordsJob类绑定  
    JobDetail jobDetail = JobBuilder.newJob(PrintWordsJob.class)  
      .withIdentity("job1", "group1")  
      .build();  
 
    // 构建Trigger实例,每隔1秒执行一次  
    Trigger trigger = TriggerBuilder.newTrigger()  
      .withIdentity("trigger1", "triggerGroup1")  
      .startNow() // 立即生效  
      .withSchedule(SimpleScheduleBuilder.simpleSchedule()  
        .withIntervalInSeconds(1) // 每隔1秒执行一次  
        .repeatForever()) // 一直执行  
      .build();  
 
    // 执行  
    scheduler.scheduleJob(jobDetail, trigger);  
    System.out.println("--------scheduler start ! ------------");  
    scheduler.start(); // 启动调度器  
 
    // 让主线程睡眠一段时间,以便观察定时任务的执行  
    Thread.sleep(5000);  
 
    // 关闭调度器  
    scheduler.shutdown();  
    System.out.println("--------scheduler shutdown ! ------------");  
  }  
}

4.运行Demo:

运行MyScheduler类的main方法,观察控制台输出。你应该会看到每隔1秒打印一次"PrintWordsJob start at:… prints: Hello Job-…"的信息。

四、总结

通过以上步骤,已经成功地搭建了一个简单的Quartz Demo,并创建了一个定时任务。Quartz框架提供了强大的任务调度功能,可以满足各种复杂的定时任务需求。在实际应用中,可以根据具体需求配置不同的Job和Trigger,以实现更复杂的业务逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2189031.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++算法】10.滑动窗口_长度最小的子数组

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;图解 题目链接&#xff1a; 209. 长度最小的子数组 题目描述&#xff1a; 解法 解法一&#xff1a;暴力求解&#xff08;会超时&#xff09; 暴力枚举出所有子数组的和。 查找子数组n2&#xff0…

03:(寄存器开发)OLED的简单使用

OLED的简单使用 将江科大的标准库开发OLED的代码进行移植&#xff0c;修改的部分代码如下&#xff1a; /*引脚配置*/ //#define OLED_W_SCL(x) GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)(x)) //#define OLED_W_SDA(x) GPIO_WriteBit(GPIOB, GPIO_Pin_9, (BitAction)(x))…

mybatis-plus使用总结

基本使用 mybatis-plus依赖 <!-- mybatis-plus开始 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.7</version></dependency><dependency>&l…

D27【 python 接口自动化学习】- python 基础之判断与循环

day27 判断和循环中常见错误 学习日期&#xff1a;20241004 学习目标&#xff1a;判断与循环&#xfe63;-38 避坑指南&#xff1a;判断和循环中的常见错误 学习笔记&#xff1a; 循环过程中改变遍历次数 遍历中修改列表导致误操作 循环嵌套中的缩进导致运行语句有差别 总结…

17 链表——21. 合并两个有序链表 ★

17 链表 21. 合并两个有序链表 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4] 算法设计: 合并两个有序链表,并保持有序性,可以采用迭代法和递归法两种…

小白必看web专题!渗透测试还是src?

大家好&#xff0c;我是Dest1ny&#xff01; 今天是回答问题的&#xff0c;有小伙伴私信我&#xff1a; 渗透测试还是src&#xff1f; 今天回答一下&#xff01; 渗透测试&#xff08;Penetration Testing&#xff09;&#xff1a; 渗透测试是一种模拟真实攻击者的技术手段&…

Vue3+TS项目 - ref和useTemplateRef获取组件实例

在Vue2中&#xff0c;子组件使用的是选项式 API &#xff0c;被引用的组件实例和该子组件的 this 完全一致&#xff0c;这意味着父组件对子组件的每一个属性和方法都有完全的访问权。这使得在父组件和子组件之间创建紧密耦合的实现细节变得很容易&#xff0c;当然也因此&#x…

java相关新技术

Java作为一种广泛应用的编程语言&#xff0c;其新技术层出不穷&#xff0c;为开发者提供了更多的工具和框架来构建高效、可扩展的应用程序。以下是一些当前比较热门的Java新技术 Java 17及更高版本&#xff1a; Java平台持续更新&#xff0c;每个新版本都带来了性能改进和新特…

C++学习笔记之类对象(一)

C学习笔记之类&对象&#xff08;一&#xff09; https://www.runoob.com/cplusplus/cpp-classes-objects.html 类是C的核心特性&#xff0c;为用户自定义的数据类型&#xff0c;可以在其中放入数据和函数作为成员&#xff0c;并且以此为模板&#xff0c;创建多个对象个体进…

三维世界的魅力:探索开源的Three.js案例

三维世界的魅力&#xff1a;探索开源的Three.js案例 原生Three.js 和 Cesium.js 案例 - 不断 - 只做开源 。 引言 在这个数字化时代&#xff0c;三维技术已经成为我们生活中不可或缺的一部分。无论是在游戏、电影制作、建筑设计还是虚拟现实中&#xff0c;三维技术都发挥…

ARM Assembly: 第8课 branching

branch causes a branch to a target address. The "B" mnemonic signifies an unconditional branch. 单个的B表示进入一个无条件的分支&#xff0c;而含条件的分支通常可以基于APSR 条件flag进行指令的执行。比如&#xff0c;基于condition flag z是否为1, 我们可…

深度学习基础—目标定位与特征点检测

1.目标定位 &#xff08;1&#xff09;定义 目标定位就是在图片中&#xff0c;定位对象的位置&#xff0c;对于对象的位置可以用框圈住显示。如下图所示&#xff1a; 假设正在进行图片分类工作&#xff0c;那么这个汽车图片很有可能被分类为汽车类别。对于目标定位&#xff0c;…

[图形学]smallpt代码详解(1)

一、简介 本文介绍了著名的99行代码实现全局光照的光线跟踪代码smallpt。 包括对smallpt的功能介绍、编译运行介绍&#xff0c;和对代码的详细解释。希望能够帮助读者更进一步的理解光线跟踪。 二、smallpt介绍 1.smallpt是什么 smallpt(small Path Tracing) 是一个全局光照…

C# List遍历元素重新赋值问题

需求&#xff1a;修改List<string>类型的链表的每一个string对象。 第一反应是List.ForEach&#xff0c;但是使用完后&#xff0c;原链表还是原链表&#xff1b; 后来又学习了一下&#xff0c;了解到C#用foreach语句对数组进行遍历,只能采用只读的方式,不能修改任何元素…

探索Kimi:用Spring Boot + Vue打造现代网站

在数字化时代&#xff0c;网站成为了企业和个人展示自己的窗口。今天&#xff0c;我将带你一起探索如何利用Spring Boot和Vue.js这两个强大的技术栈&#xff0c;结合Kimi的智能助手功能&#xff0c;来构建一个现代的网站。这不仅是一个技术分享&#xff0c;更是一次实战演示&am…

一个信号量操作的例子

代码&#xff1a; #include<stdio.h> #include<sys/sem.h> #include<sys/ipc.h> #include<errno.h> #include<string.h> typedef int sem_t; union semun{ int val; struct semid_ds *buf; unsigned short *array; }arg;sem_t CreateSem(key_t …

【Qt】控件概述 (1)—— Widget属性

控件概述 1. QWidget核心属性1.1核心属性概述1.2 enable1.3 geometry——窗口坐标1.4 window frame的影响1.4 windowTitle——窗口标题1.5 windowIcon——窗口图标1.6 windowOpacity——透明度设置1.7 cursor——光标设置1.8 font——字体设置1.9 toolTip——鼠标悬停提示设置1…

IDEA中用过git之后文件名颜色全变红

在File->Settings->Version Control里点击左下角的号&#xff0c; 选择<none> 之后点击Apply即可恢复之前的颜色

11.1 Linux_线程_线程相关函数

概述 线程的共享资源&#xff1a; 可执行的指令、静态数据、文件描述符、当前工作目录、用户ID、用户组ID 线程的私有资源&#xff1a; 线程ID、程序计数器PC和相关寄存器、堆栈、错误号、优先级、执行状态和属性 线程编译&#xff1a; gcc <.c文件> -l pthread -o…